服务端和客户端在同一台计算机上
服务端用Java开发的,客户端用VC开发的,一般情况下运行正常,可是期间时不时的来一个客户端recv出错,几率很小,客户端错误代码10053 Software caused connection abort(软件原因导致连接中断)。而对应的Java服务端也会出错,错误代码Connection reset by peer(连接被对方复位)。各位大侠,出这种错误的原因到底在哪?好像特别不好确定错误原因?
解决了我另开贴给足500分!!
服务端用Java开发的,客户端用VC开发的,一般情况下运行正常,可是期间时不时的来一个客户端recv出错,几率很小,客户端错误代码10053 Software caused connection abort(软件原因导致连接中断)。而对应的Java服务端也会出错,错误代码Connection reset by peer(连接被对方复位)。各位大侠,出这种错误的原因到底在哪?好像特别不好确定错误原因?
解决了我另开贴给足500分!!
{
*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:.....
接收交易返回<--APPSRV fail,LastWSAError(10053)
if ( recv_len == SOCKET_ERROR )
{
DGlobalVals::ShowMsg(2,"接收交易返回<--APPSRV fail,LastWSAError(%d)", WSAGetLastError());
closesocket(m_connectfd);
goto MYERROR;
}不建议用goto语句,你可以把myerror的部分写成一个函数来调用。
1。知道用goto不好,但是出这个错应该不是goto引起的吧
2。两个程序在同一台计算机上,而且因为是内部运营局域网内,那台机器上都没有安装防火墙和杀毒软件
3。客户端是多线程并发短连接到服务端的,如果是承载数的问题,出错的时候应该是send报错才对,怎么会是recv的时候报10053
先问一下,程序中recv_buf是如何定义的?
unsigned char send_buf[80000];
unsigned char recv_buf[80000];
----------------------------------------------
发送和接受间加个sleep(100)呢?
send和recv之间也需要添加sleep(100)的?
if ( recv_len <= 0 || recv_len > 2000)这个判断不能说明出错,而没有错误时GetLastError的值也不能说明问题。
{
DGlobalVals::ShowMsg(2,"接收交易返回<--APPSRV fail,LastWSAError(%d)", WSAGetLastError());
//在这里下断点,看看recv_buf的内存状态.和recv_len的长度,或者你把这个判断去掉呢?recv_len > 2000
closesocket(m_connectfd);
goto MYERROR;
}
明天我要是解决了贴出代码来
mysend(m_connectfd,(char *)send_buf,send_len,0,false)
经过裁剪的代码很可能把错误隐藏了。
另外建议把真正的代码都贴出来,上面贴的这些代码看不出问题。
接收之后加不加sleep没用,我的recv已经出错了
网上说的连接数都是说远程桌面的。有些说如果是连接数限制,报的错是10048。而我的是10054和10038