返回信息流客户端和服务器都用的Winsock,版本1.1
客户端频繁向服务器发送消息,服务器接到消息后不做任何处理然后向客户端发送一条消息,客户端计数器加1,每1000条打印一条记录。
这样没6w条记录的时候会卡,连接错误,请问是什么原因,有人遇到过吗?
客户端
#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;
while (1)
{
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))<0)
{
printf("Connect error!\n");
Sleep(100);
continue;
}
if(send(sockClient, "this is client.", strlen("this is client.")+1, 0)<0)
{
printf("Send error!\n");
Sleep(100);
continue;
}
memset(szRecBuf,100,'0');
if (recv(sockClient, szRecBuf, sizeof(szRecBuf), 0)<0)
{
printf("Receive error!\n");
Sleep(100);
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 %s!", inet_ntoa(addrClient.sin_addr));
send(sockConn, szSendBuf, strlen(szSendBuf)+1, 0);
closesocket(sockConn);
printf("close accept socket\n");
}
closesocket(sockSrv);
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #40356同步于 2010/6/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
服务器压力测试
CLegend
2010/6/8镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 hs 的大作中提到: 】
: 你有关闭连接么?总共就65536个端口,不用完才怪呢
: --
: 欢迎访问我的博客 http://www.wanlxp.com/blog/
: ...................
仔细看了一下,客户端,确实关闭了,不过由数字6万多猜想,可能是因为OS没有释放端口资源,将端口分配完了。