本帖最后由 zxdplay2 于 2010-05-13 19:23:12 编辑

解决方案 »

  1.   

    sckConnectionReset 10054 通过远端重新设置连接 
    1、lz用的Socket的什么模型?
    2、帖你的客户端的代码看看
      

  2.   

    连接远端用是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);
    }
    我怀疑是不是由于客户端没有接收服务器发送的包,发送的数据包在路由器的缓冲中赌起了造成了网路瘫痪
      

  3.   

    ConnectThread(server_ip_addr)){这个函数实现都没有贴出来,这个应该是关键吧,你那样帖有什么用
      

  4.   

    刚开始不要一下子创建那么多连接.看看如果只一个连接会是什么情况?多大连接数是10054错误的临界点.如果用select,估计不能支持那么多的连接数.具体参考windows网络编程第二版.
      

  5.   

    客户端 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;}//