异步发送文件的问题?
本帖最后由 VisualEleven 于 2013-08-16 15:29:12 编辑 客户端向服务器发送文件的时间,客户端记录发送的文件是正确的,但服务器端收包返回老是-1,请高手看看代码
客户端:
WSADATA WSAData={0};
SOCKET sockfd;
struct sockaddr_in addr;
timeval tm;
fd_set set;
ULONG TimeOut = 2000; //设置发送超时2秒
if(WSAStartup(MAKEWORD(2,2), &WSAData)) return 0;
sockfd=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd == INVALID_SOCKET)return 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR)return 0;
TimeOut = 5000; //设置接收超时2秒
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR)return 0;
//设置非阻塞连接
unsigned long ul = 1;
if(ioctlsocket(sockfd,FIONBIO,(unsigned long*)&ul)==SOCKET_ERROR)return 0;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(pServerIP);
addr.sin_port = htons(ServerPort);
connect(sockfd,(SOCKADDR *)&addr,sizeof(addr));
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(sockfd, &r);
timeout.tv_sec = 3; //连接超时3秒
timeout.tv_usec =0;
int ret = select(0, 0, &r, 0, &timeout);
if(ret<=0){closesocket(sockfd);/* printf("连接超时\r\n");*/return 0; }
ULONG Seek=0;
while(Seek<SendBufLen)
{
ULONG sendlen=send(sockfd,(char *)(pSendBuf+Seek),SendBufLen-Seek,0);
Seek+=sendlen;
}
服务器端收到的包头为包的长度,每次连接先申请一个8196大小的缓冲区,如果收到的包大于8196则重新分配:
char *Buf=new char[8196];
ULONG BufLen=8196;
SOCKET sock=(SOCKET)pParam;
ULONG recvLen=::recv(sock,Buf,BufLen,0);
ULONG PackLen=*(ULONG *)(Buf);
BufLen=PacketLen;
if(PacketLen>8196)
{
char *Temp=new char[PacketLen+1];
memcpy(Temp,Buf,recvLen);
delete[] Buf;
Buf=Temp;
}
char *precv=Buf+recvLen;
while(precv<Buf+BufLen)
{
recvLen=::recv(sock,precv,BufLen-(precv-Buf),0);//直接在这儿就返回-1了
precv+=recvLen;
if(-1==recvLen)
{
delete[] Buf;
return 0;
}
}
这段代码客户端和服务器端都在本机上没问题,但一分开在别的服务器上就返回-1
请高手帮忙看看代码哪儿有问题
[解决办法]
你服务器端不是用的WSAAsyncSelect模型吗?利用消息啊~
[解决办法]
FD_RECV和FD_SEND也要绑定一下吧,不然收不到recv消息。
然后在回调函数中,根据参数解析出是Recv还是accept,recv的话就调用recv函数收数据,然后保存收到的数据,如果收到数据的总长度等于文件的总长度,说明传送完毕。