初学socket
客户端和服务器都用的Winsock,版本1.1
思路是这样的:客户端循环向服务器发送信息,服务器收到消息后也向客户端发送一条信息,客户端收到消息后,计数器加1,加到1000后打印一次。
遇到的问题:打印到大概62500多条时,连接错误,然后就频繁的连接错误,偶尔会连接上打印一次,如果此时暂停客户端的发送,那么隔一段时间后又恢复正常,不知道这是什么问题。
具体代码如下:
客户端:
#include "Winsock.h"
#include "stdio.h"
int main()
{
WORD wVersionRequested;
WSAData wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return 0;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}


SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4000);
char szRecBuf[100];
int i=0;
SOCKET sockClient;
while (1)
{
sockClient = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))<0)
{
printf("Connect error!\n");
closesocket(sockClient);
continue;
}
if(send(sockClient, "this is client.", strlen("this is client.")+1, 0)<0)
{
printf("Send error!\n");
closesocket(sockClient);
continue;
}
memset(szRecBuf,100,'0');
if (recv(sockClient, szRecBuf, sizeof(szRecBuf), 0)<0)
{
printf("Receive error!\n");
closesocket(sockClient);
continue;
}
closesocket(sockClient);
i++;
printf("\r%d",i);
if(i%1000==0)
printf("\n");
}
WSACleanup();
return 0;
}
服务端:
#include <Winsock.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return 0;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4000); bind(sockSrv, (sockaddr*)&addrSrv, sizeof(SOCKADDR));
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (1)
{
printf("begin accept\n");
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
printf("accepted\n");
char szSendBuf[100], szRecBuf[100];
recv(sockConn, szRecBuf, sizeof(szRecBuf), 0);
printf("%s\n", szRecBuf);
memset(szRecBuf,100,'0');
sprintf(szSendBuf, "Welcome!");
send(sockConn, szSendBuf, strlen(szSendBuf)+1, 0);
closesocket(sockConn);
printf("close accept socket\n");
}
closesocket(sockSrv);
return 0;
}
期待各位来解答

解决方案 »

  1.   

    WSAGetLastError 可以得到错误信息
      

  2.   

    错了错了,是10048,WSAEADDRINUSE
      

  3.   

    这不是很简单的问题吗?
    你closesocket后
    又不是立即关闭连接
    还需要经过2个TIME-WAIT阶段
    只要经过这个时间段后
    连接才会实际关闭
    你一定时间内频繁连接关闭
    导致了大量的等待关闭的SOCKET队列
    到系统上限了,就无法继续了
      

  4.   

    When a TCP connection is closed, connection resources at the node that initiated the close are put into a wait state, called TIME-WAIT, to guard against data corruption if duplicate packets linger in the network. This ensures both ends are finished with the connection. This can cause depletion of resources required per-connection, such as RAM and ports, when applications open and close connections frequently.仔细理解这段话,MSDN的原文。你这不是压力测试,这是乱搞端口。