谁帮我看看这个socket的sendto函数哪里错了?返回的错误代码是10038

Segment fault 2015-06-08 11:44:27
谁帮我看看这个socket的sendto函数哪里错了?返回的错误代码是10038

// Server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include"iostream"
using namespace std;

#define MAX_LENGTH 1024*1

int _tmain(int argc, _TCHAR* argv[])
{
system("COLOR F0");
WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD(2, 2);

if (WSAStartup(wVersionRequested, &wsaData) != 0)//初始化ws2_32.dll动态库
{
printf("WSAStartup() failed!\n");//Winsock初始化错误

exit(-1);
}

if (wsaData.wVersion != wVersionRequested)
{
printf("The version of Winsock is not suited!\n");//Winsock版本不匹配

WSACleanup();//结束对ws2_32.dll的调用

exit(-2);

}

//说明ws2_32.dll正确加载
printf("Load ws2_32.dll successfully!\n");

//获取本机IP地址
char PCname[100] = { "" };
char *IPaddress = NULL;
gethostname(PCname, sizeof(PCname));
printf("Local Hostname is %s.\n", PCname);

struct hostent FAR * lpHostEnt = gethostbyname(PCname);
if (lpHostEnt == NULL)
{
//产生错误
printf("gethostbyname failed!\n");

return 0;
}
//获取IP
LPSTR lpAddr = lpHostEnt->h_addr_list[0];
if (lpAddr)
{
struct in_addr inAddr;
memmove(&inAddr, lpAddr, 4);
//转换为标准格式
IPaddress = inet_ntoa(inAddr);//将一个32位数字表示的IP地址转换成点分十进制IP地址字符串
if (sizeof(IPaddress) == 0)
printf("get host IP failed!\n");
else
printf("Local HostIP is %s.\n", IPaddress);
}

//创建套接字
SOCKET servsock, clisock;
printf("Create Socket...\n");
servsock = socket(AF_INET, SOCK_DGRAM, 0);//数据报套接字
clisock = socket(AF_INET, SOCK_DGRAM, 0);
int servport = 5555;
int iSockErr = 0;

//定义服务器地址结构
sockaddr_in udpaddr, cliaddr;
memset(&udpaddr, 0, sizeof(udpaddr));
memset(&cliaddr, 0, sizeof(cliaddr));

int clilen = sizeof(cliaddr);
udpaddr.sin_family = AF_INET;
udpaddr.sin_port = htons(servport);
//将一个点分十进制IP地址字符串转换成32位数字表示的IP地址
udpaddr.sin_addr.s_addr = inet_addr(IPaddress);//"127.0.0.1"//INADDR_ANY

//绑定套接字到服务器地址结构
printf("Binding...\n");
iSockErr = bind(servsock, (sockaddr *)&udpaddr, sizeof(udpaddr));
if (iSockErr == SOCKET_ERROR)
{
printf("Binding failed:%d\n", WSAGetLastError());//根据不同的错误类型进行不同的处理
exit(-3);
}

clisock = accept(servsock, (struct sockaddr *)&cliaddr, &clilen);
int len = 0;
//函数调用成功,进行其他处理
FILE *fp = NULL;
errno_t err;
err = fopen_s(&fp,"Picture.jpg", "rb");
if (fp == NULL){
printf("Open Mp3 File Failed!\n");
exit(-5);
}

char buffer[MAX_LENGTH] = "\0";
char *bufptr = buffer;
int i = 0;
while (!feof(fp))
{
int iBytesRead = fread(bufptr,1,MAX_LENGTH,fp);
int iRet = sendto(clisock, buffer, iBytesRead, 0, (struct sockaddr*)&cliaddr, clilen);
if (iRet == SOCKET_ERROR){
int errNo = WSAGetLastError();
printf("send file failed!\n");
printf("错误代码:%d\n", errNo);
closesocket(clisock);
break;
}
else if (iRet == 0)
{
printf("send mp3 file successfully!\n");
break;
}
printf("send packet %d lenth: %d\n", i++, iBytesRead);

Sleep(120);
}

//关闭连接
shutdown(servsock, 2);
closesocket(servsock);
WSACleanup();
return 0;
}
...全文
975 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
小要饭 2015-06-09
  • 打赏
  • 举报
回复
好像是套接字失效.
draculamx 2015-06-09
  • 打赏
  • 举报
回复
当你的TCP连接被断开的时候,你还发送数据的话,就会出现这个错误

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧