18,356
社区成员
发帖
与我相关
我的任务
分享
#include<WinSock2.h>
#include<iostream>
#include<assert.h>
#pragma comment(lib, "Ws2_32.lib")
void readall(SOCKET sock,char *buf,int len,int line)
{
int left = len,ret;
while(left){
ret = recv(sock,buf+len-left,left,0);
if (ret == SOCKET_ERROR) {
wprintf(L"readall failed with error: %d line:%d\n", WSAGetLastError(),line);
closesocket(sock);
WSACleanup();
Sleep(10000);
return;
}
left-=ret;
if (left) {
std::cout<<"readall line:"<<line<<"need one more time!\n";
if (line>=75)
std::cout<<"ret= "<<ret<<'\n';
}
}
}
void sendall(SOCKET sock,char *buf,int len,int line)
{
int left = len, ret;
while (left) {
ret = send(sock,buf+len-left,left,0);
if (ret == SOCKET_ERROR) {
wprintf(L"readall failed with error: %d line:%d\n", WSAGetLastError(),line);
closesocket(sock);
WSACleanup();
Sleep(10000);
return;
}
left-=ret;
if (left){
std::cout<<"sendall line:"<<line<<"need one more time!\n";
if (line>=80)
std::cout<<"ret= "<<ret<<'\n';
}
}
}
int main()
{
WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
int ret;
if(WSAStartup(sockVersion, &data) != 0)
{
return 0;
}
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET)
{
printf("invalid socket !");
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(22222);
serAddr.sin_addr.S_un.S_addr = inet_addr("172.18.19.110");
if (connect(sock, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("connect error !");
closesocket(sock);
return 0;
}
char buf[128];
int j,n;
for (j=0;j<10000;j++) {
sprintf(buf,"%d,%d,%d\n",0,0,0);
sendall(sock,buf,strlen(buf),__LINE__);
readall(sock,buf,4,__LINE__);
n = *(int *)buf;
assert(n==4);
/*for (int ii=0;ii<n;ii++) {
readall(sock,buf,16,__LINE__);
}*/
readall(sock,buf,64,__LINE__);
std::cout<<"j= "<<j<<std::endl;
Sleep(1000);
}
std::cout<<"final j= "<<j<<std::endl;
}
然后这个执行的输出结果:
C:\Users\lynus\Desktop\mfc_socket\Release>mfc_socket.exe
readall line:84need one more time!
ret= 4
j= 0
j= 1
j= 2
j= 3
j= 4
j= 5
j= 6
j= 7
j= 8
j= 9
j= 10
j= 11
j= 12
j= 13
j= 14
j= 15
readall failed with error: 10053 line:77
^C
程序的逻辑就是,在成功的connect以后,执行一个loop,在loop里面先发送6字节数据,然后接受4字节,最后再接收64字节数据。从数据结果来看,只能运行14次loop,然后就报错了。
后来我用wireshark抓包发现,是我接收到64字节字节数据后,本机发送了一个tcp RST 包到了远端。说明确实本机主动断开了连接。我实在是弄不懂哪里有问题了。
ps。winxp运行没有问题,win7和win8都有上述问题。