程序大致如下,现在出现的问题是在完成长连接之后,多次的收发数据,大概几百次左右sl_Send就会返回负值,报ERR_PRINT(SEND_ERROR);3次后跳出while,程序重新建立socket,这一次还重新能跑回sl_Send那,收发一次成功之后,会再出现sl_Send返回负值,跳出while,再重新建立socket就会在sl_bind上一直报错,ERR_PRINT(BIND_ERROR);我看过它的返回值iStatus是-99,也就是SL_EADDRNOTAVAIL这个错误。我整个程序就这里使用了g_GateWayInfo.TCP_iport这个端口,为什么会出现EADDRNOTAVAIL的错误呢?然后我现在要怎么解决这个问题?
while(1){
sLocalAddr.sin_family = SL_AF_INET;
sLocalAddr.sin_port = sl_Htons((unsigned short)g_GateWayInfo.TCP_iport);
sLocalAddr.sin_addr.s_addr = 0;
iAddrSize = sizeof(SlSockAddrIn_t);
g_TcpSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
if( g_TcpSockID < 0 ) {
ERR_PRINT(SOCKET_CREATE_ERROR);
}
else{
iStatus = sl_Bind(g_TcpSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);
if( iStatus < 0 ) {
sl_Close(g_TcpSockID);
ERR_PRINT(BIND_ERROR);
}
else{
iStatus = sl_Listen(g_TcpSockID, 0);
if( iStatus < 0 ){
sl_Close(g_TcpSockID);
ERR_PRINT(LISTEN_ERROR);
}
else{
g_TcpAcceptSockID = SL_EAGAIN;
g_TcpAcceptSockID = sl_Accept(g_TcpSockID, ( struct SlSockAddr_t *)&sAddr,
(SlSocklen_t*)&iAddrSize);
if( g_TcpAcceptSockID == SL_EAGAIN ) {
MAP_UtilsDelay(10000);
}
else if( g_TcpAcceptSockID < 0 ) {
sl_Close(g_TcpAcceptSockID);
sl_Close(g_TcpSockID);
ERR_PRINT(ACCEPT_ERROR);
}
else{
while(1){
GateWayDataRevAndProcess(&GateWayTcpRecvBuf,g_TcpAcceptSockID);
iStatus = sl_Send(g_TcpAcceptSockID, (char *)&GateWaySendBuf, sTestBufLen, 0 );
if( iStatus < 0 ) {
g_SendCnt++;
ERR_PRINT(SEND_ERROR);
if(g_SendCnt > 3){
g_SendCnt = 0;
sl_Close(g_TcpAcceptSockID);
break;
}
}
}
}
}
}
}