请问如何解决出现大量的socket WSAECONNRESET(10054) 错误!

zxdplay2 2010-05-13 07:13:17
两台机器,一台win server2003作服务器, 一台winxp作客户端

客户端首先向服务器申请建立了一个10000个socket连接, 每个socket接收缓冲是8K,然后客户端线程进入一个死循环,
while(1){Sleep(5000);}
客户端仅仅是建立了连接,将套接口装到数组中,其他什么都不做包括接收数据,双方连接建立完毕后,服务器使用选择端口,分批(64个套接口一批)向客户端发送数据,每次向每一个套接口发送2K数据,也就是调用send(),
问题就出在为什么服务器每次调用send()总是返回 WSAECONNRESET(10054) 的错误,但客户端实际上并没有调用closesocket(),也就是并没有强迫关闭套接口。

另外,如果连接只有5000个的情况下,发送还算正常,最多客户端那边接收缓冲装满,但不至于关闭连接,好像是套接口的数量越多,连接就越不稳定,出错的几率越大!
...全文
874 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxdplay2 2010-05-14
  • 打赏
  • 举报
回复
客户端的缓冲改成了64k,但连接数多了问题照样存在
zxdplay2 2010-05-14
  • 打赏
  • 举报
回复
客户端 ConnectThread()

本来是个线程回调函数,后来只当成一般函数调用了一次

//-----------------------------------------------------------------------------
//
// 连接服务端
//
//-----------------------------------------------------------------------------
DWORD ConnectThread( const char* p_char_ip ){

int iPort=DEFAULT_PORT;
WSADATA wsaData;
sockaddr_in ser;
bool is_need_connect=false;
int i_try_count=0;//尝试计数

//提示信息
printf(
"-----------------------------------\n\
初始化客户端。。。\n\
-----------------------------------\n"
);
//加载Winsock DLL
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){
printf("加载 Winsock失败!");
WSACleanup();
return 0;
}
printf(
"-----------------------------------\n\
初始化客户端完成\n\
-----------------------------------\n"
);

//绑定客户端套接字,指定套接字的,IP地址与端口号
//进入一个有限循环,建立与服务端的连接
for( int i=0; i<g_client_config.m_i_max_count_of_user; i++){
//初始化需要绑定的数据
ser.sin_family = AF_INET;
ser.sin_port = htons( iPort);
ser.sin_addr.s_addr = inet_addr(p_char_ip);

//创建客户端套接字
g_p_socket_list[i]=NULL;
g_p_socket_list[i]=socket( AF_INET, SOCK_STREAM, 0 );
if( g_p_socket_list[i] == INVALID_SOCKET ){
printf("创建套接字失败!%d\n",WSAGetLastError());
return 0;
}else{
printf("编号%d 套接口创建成功!\n",i);
int optname=0;
int optlen=0;
int reset_op = 64*1024;
optlen=sizeof(optname);
//重新设置接收缓冲为64K
if(setsockopt(g_p_socket_list[i], SOL_SOCKET, SO_RCVBUF, (char*)&reset_op,sizeof(reset_op))
==SOCKET_ERROR){
printf("getsockopt() Error:%u\n",WSAGetLastError());
return 0;
}//

}//

//连接服务器
is_need_connect=true;
while(is_need_connect){
if(connect(g_p_socket_list[i],(sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET){
int i_last_error = WSAGetLastError();
printf("连接服务器 失败:%d\n",i_last_error);
switch( i_last_error ){
case 10051://未能到达服务端
printf("编号: %d 未能到达服务端,再次尝试! \n尝试次数 %d\n",i,i_try_count);
Sleep(1000);
is_need_connect=i_try_count++<20;
break;

case 10060: //连接超时
case 10061: //服务器繁忙
printf("服务器繁忙,再次尝试! 编号: %d\n尝试次数 %d\n",i,i_try_count);
Sleep(1000);
is_need_connect=i_try_count++<20;
break;
default:
printf("未找到错误原因,默认处理关闭套接字!: %d\n",i);
is_need_connect=false;
closesocket(g_p_socket_list[i]);
g_p_socket_list[i]=NULL;
}//
}else{
i_try_count=0;
printf("编号%d 连接服务器成功!\n",g_i_fact_connect_count++);
is_need_connect=false;
}//

//尝试的次数太多了
if(i_try_count>=20){
return 0; //连接失败
}//

}//end whilewhile(is_need_connect)

}//end for


return 1;

}//
whs1980 2010-05-14
  • 打赏
  • 举报
回复
刚开始不要一下子创建那么多连接.看看如果只一个连接会是什么情况?多大连接数是10054错误的临界点.如果用select,估计不能支持那么多的连接数.具体参考windows网络编程第二版.
dinona 2010-05-14
  • 打赏
  • 举报
回复
ConnectThread(server_ip_addr)){

这个函数实现都没有贴出来,这个应该是关键吧,你那样帖有什么用
zxdplay2 2010-05-14
  • 打赏
  • 举报
回复
连接远端用是Select(),代码太多了,只能把架子列出来

//客户端主线程
DWORD WorkThread( LPVOID param ){

//连接服务器
if(ConnectThread(server_ip_addr)){
//进入接收循环
while(1){
//RecvFromSocket();//实际上没有接收
Sleep(200);
}//
}else{
printf("建立连接失败!");
}//

return 1;
}


//服务器
while(1){
............//选64个套接口加入发送集合fdsend
status=select(0,NULL,&fdsend,NULL,&tv);
if( status==SOCKET_ERROR ){
printf("select ERROR:%d",WSAGetLastError());
Sleep(2000);
}else if(status==0){
printf("未收到发送应求!\n");
//超时处理
}else{
for(unsigned int i=0;i<64;i++){
cur_socket = g_p_socket_list[i_socket_index_list[i]];
assert( cur_socket!=NULL );
//检查套接口是否在发送集合中
if(cur_socket!=NULL && FD_ISSET(cur_socket, &fdsend)){
.......
send();//调用send()
}
}
Sleep(3000);
}


我怀疑是不是由于客户端没有接收服务器发送的包,发送的数据包在路由器的缓冲中赌起了造成了网路瘫痪
周药师 2010-05-14
  • 打赏
  • 举报
回复
贴代码注意格式!
客户端代码不详细;
你检查一下你客户端的代码
周药师 2010-05-13
  • 打赏
  • 举报
回复
sckConnectionReset 10054 通过远端重新设置连接
1、lz用的Socket的什么模型?
2、帖你的客户端的代码看看

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧