服务端和客户端在同一台计算机上
服务端用Java开发的,客户端用VC开发的,一般情况下运行正常,可是期间时不时的来一个客户端recv出错,几率很小,客户端错误代码10053 Software caused connection abort(软件原因导致连接中断)。而对应的Java服务端也会出错,错误代码Connection reset by peer(连接被对方复位)。各位大侠,出这种错误的原因到底在哪?好像特别不好确定错误原因?
解决了我另开贴给足500分!!

解决方案 »

  1.   

    int DMyThread::ConnectSocket(SOCKET * Con, CString sRemoteIP, UINT nRemotePort, CString sRemoteBKIP, UINT nRemoteBKPort, UINT nAppsvrLinkTimeout)
    {
    *Con = socket(AF_INET, SOCK_STREAM, 0);
    if (!DGlobalVals::SetSocketTimeOut(*Con, nAppsvrLinkTimeout * 1000))
    {
    closesocket(*Con);
    return 1;
    }
    struct sockaddr_in cntaddr_in;
    cntaddr_in.sin_family = AF_INET;
    cntaddr_in.sin_addr.s_addr=inet_addr(sRemoteIP);
    cntaddr_in.sin_port = ntohs(nRemotePort);
    int nRet = connect(*Con, (struct sockaddr *)&cntaddr_in, sizeof(struct sockaddr_in));
    if(nRet == SOCKET_ERROR )
    {
    closesocket(*Con);
    return 2;
    }
    return 0;
    }
    int DMyThread::mysend(SOCKET s, const char * buf, int len, int flags)
    {
    if(bDisplayDbg)
    {
    char tmp[5120];
    memset(tmp, 0, sizeof(tmp));
    DGlobalVals::ShowMsg(0, "Send BufLen %d, Buf %s", len, mybintohex((unsigned char *)buf, len, (unsigned char *)tmp));
    }
    return send(s, buf, len, flags);
    }
    int DMyThread::myrecv(SOCKET s, char * buf, int len, int flags)
    {
    int n = recv(s, buf, len, flags);
    if((n > 0) && (n < 2560) && bDisplayDbg)
    {
    char tmp[5120];
    memset(tmp, 0, sizeof(tmp));
    DGlobalVals::ShowMsg(0, "Recv BufLen %d, Buf %s", n, mybintohex((unsigned char *)buf, n, (unsigned char *)tmp));
    }
    return n;
    }
    ------------------------------------------------------------------------------------------
    SOCKET m_connectfd;
    int nConRet = ConnectSocket(&m_connectfd, sRemoteIP, nRemotePort, "", 0, nAppsvrLinkTimeout);
    if(nConRet == 1)
    {
    DGlobalVals::ShowMsg(2, "设置Socket超时时间失败,LastWSAError %d", WSAGetLastError());
    goto MYERROR;
    }
    if (nConRet == 2)
    {
    DGlobalVals::ShowMsg(2, "=无法与APPSVR建立通信链路,LastWSAError %d", WSAGetLastError());
    goto MYERROR;
    }
    if ( mysend(m_connectfd,(char *)send_buf,send_len,0,false) != send_len ) 
    {
    DGlobalVals::ShowMsg(2,"发送交易-->APPSRV fail,LastWSAError(%d)", WSAGetLastError());
    closesocket(m_connectfd);
    goto MYERROR;
    }
    memset(recv_buf,0,sizeof(recv_buf));
    recv_len=myrecv(m_connectfd,(char *)recv_buf,sizeof(recv_buf),0);
    if ( recv_len <= 0 || recv_len > 2000) 
    {
    DGlobalVals::ShowMsg(2,"接收交易返回<--APPSRV fail,LastWSAError(%d)", WSAGetLastError());
    closesocket(m_connectfd);
    goto MYERROR;
    }
    closesocket(m_connectfd); 
    .....MYERROR:.....
      

  2.   

    报错的信息:
    接收交易返回<--APPSRV fail,LastWSAError(10053)
      

  3.   

    仅凭这些代码尚未能看出什么,方便的话把客户端发给我试下看看原因[email protected]
      

  4.   

    客户端?不方便发送。如果上面的那段代码没有什么问题的话,我到Java服务端找问题去
      

  5.   

    recv_len = myrecv(m_connectfd,(char *)recv_buf,sizeof(recv_buf),0);
    if ( recv_len == SOCKET_ERROR  )
    {
      DGlobalVals::ShowMsg(2,"接收交易返回<--APPSRV fail,LastWSAError(%d)", WSAGetLastError());
      closesocket(m_connectfd);
      goto MYERROR; 
    }不建议用goto语句,你可以把myerror的部分写成一个函数来调用。
      

  6.   

    to yxz_lp(平乐无忧)
    1。知道用goto不好,但是出这个错应该不是goto引起的吧
    2。两个程序在同一台计算机上,而且因为是内部运营局域网内,那台机器上都没有安装防火墙和杀毒软件
    3。客户端是多线程并发短连接到服务端的,如果是承载数的问题,出错的时候应该是send报错才对,怎么会是recv的时候报10053
      

  7.   

    发送和接受间加个sleep(100)呢?
      

  8.   

    可以确定的是,这是客户端的问题。从上面的代码中看不出错误,最好能通过简单的测试代码体现出问题。
    先问一下,程序中recv_buf是如何定义的?
      

  9.   

    程序中recv_buf是如何定义的?线程的全局变量
    unsigned char send_buf[80000];
    unsigned char recv_buf[80000];
    ----------------------------------------------
    发送和接受间加个sleep(100)呢?
    send和recv之间也需要添加sleep(100)的?
      

  10.   

    既然长度是80000,那就有可能接收的数据大于2000了,所以
    if ( recv_len <= 0 || recv_len > 2000)这个判断不能说明出错,而没有错误时GetLastError的值也不能说明问题。
      

  11.   

    if ( recv_len <= 0 || recv_len > 2000) 
    {
        DGlobalVals::ShowMsg(2,"接收交易返回<--APPSRV fail,LastWSAError(%d)", WSAGetLastError());
        //在这里下断点,看看recv_buf的内存状态.和recv_len的长度,或者你把这个判断去掉呢?recv_len > 2000
        closesocket(m_connectfd);
        goto MYERROR;
    }
      

  12.   

    10053错误可能是系统缓冲区满了,还有就是超时,估计是java那边的问题比较大,封装的东西太多了.或者lz写个测试模拟数据的java端,检验下你的vc程序吧
      

  13.   

    我刚封装的一个socket用的是非阻塞方式, 有时也会出现这个问题.有些烦 现在还没有解决.关注一下.
    明天我要是解决了贴出代码来
      

  14.   

    回20楼的不关那个的事,我们的系统都是一个包一个交易,包的长度不会超过2k,定义80000是最初始的类定义的。另外出10053时候recv_len的值也显示出来的,是-1。根本不管缓冲的事。。
      

  15.   

    4楼的代码不是实际代码,从下面这个函数调用就可以看出,mysend定义了4个参数,而下面调用却传5个参数。
    mysend(m_connectfd,(char *)send_buf,send_len,0,false)
    经过裁剪的代码很可能把错误隐藏了。
      

  16.   

    最后一个参数是创建校验位的,为true的时候才会有,而报10053错的时候根本就还没有执行过那段代码,所以没有贴出来,肯定不关那段代码的事
      

  17.   

    send和recv之间添加了个sleep后,原来的10054错误变成了10038了。头疼死了,折腾了这么久还没好,哪位大哥帮帮忙
      

  18.   

    首先确认recv返回的是SOCKET_ERROR,建议在recv之后用if语句判断返回值是SOCKET_ERROR时显示个消息框。
    另外建议把真正的代码都贴出来,上面贴的这些代码看不出问题。
      

  19.   

    不嫌麻烦的话,发送和接收之间,接受之后,各加个sleep试试
      

  20.   

    发送和接收之间的sleep已经加了,看32楼。
    接收之后加不加sleep没用,我的recv已经出错了
      

  21.   

    不一定,因为并不是已开始就出错,前边的sleep就起作用了
      

  22.   

    操作系统Windows Server 2003 Enterprise Editio,怎么改连接数。
    网上说的连接数都是说远程桌面的。有些说如果是连接数限制,报的错是10048。而我的是10054和10038
      

  23.   

    int DMyThread::ConnectSocket(SOCKET * Con,楼主看看你的指针是不是有地方使用错误了.