异步发送文件的问题?
本帖最后由 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;
}
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;
}
}
[解决办法]
你服务器端不是用的WSAAsyncSelect模型吗?利用消息啊~
[解决办法]