Tcp recv()函数返回0,并且在超时后创建新套接字时无法与服务器重新连接

Tcp recv()函数返回0,并且在超时后创建新套接字时无法与服务器重新连接,tcp,ip,Tcp,Ip,我有连接到端口和服务器IP地址的windows TCP客户端应用程序。 它连接到服务器,工作正常。此应用程序每2秒钟向服务器发送一次数据并获得响应。在工作应用程序recv()中有一段时间没有得到任何响应,并返回超时10060。我们连续3次检查recv()函数是否有响应,但每次都返回超时10060。 然后,我们关闭套接字并创建新的套接字以启动新连接,但此时recv()将恢复0或10054错误,但无法再次与服务器连接 //INIT TCP WSADATA wsaData; int iResult;

我有连接到端口和服务器IP地址的windows TCP客户端应用程序。 它连接到服务器,工作正常。此应用程序每2秒钟向服务器发送一次数据并获得响应。在工作应用程序recv()中有一段时间没有得到任何响应,并返回超时10060。我们连续3次检查recv()函数是否有响应,但每次都返回超时10060。 然后,我们关闭套接字并创建新的套接字以启动新连接,但此时recv()将恢复0或10054错误,但无法再次与服务器连接

//INIT TCP

WSADATA wsaData;
int iResult;

SOCKET ConnectSocket = INVALID_SOCKET;
*ConnectSocketOut =    INVALID_SOCKET;
struct sockaddr_in clientService[MAX_PRINTERS];

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        return 1;
    }

//----------------------
// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); //IPPROTO_TCP
if (ConnectSocket == INVALID_SOCKET) {
    WSACleanup();
    return 1;
}

//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
clientService[Index].sin_family = AF_INET;
clientService[Index].sin_addr.s_addr = inet_addr(PortInformation[Index].IPAddress);     
     clientService[Index].sin_port = htons(PortInformation[Index].TCPPortNum);
//----------------------
// Connect to server.
WSASetLastError(0);
iResult = connect(ConnectSocket, (SOCKADDR*)&clientService[Index], sizeof(clientService[Index]));
if (iResult == SOCKET_ERROR) {
    int ErrSt = WSAGetLastError();
    closesocket(ConnectSocket);
    WSACleanup();
    ConnectSocket = INVALID_SOCKET;
    *ConnectSocketOut = ConnectSocket;
    return 1;
}
else
{
    *ConnectSocketOut = ConnectSocket;              
}

 //send data

int iResult = 0;
   if (ConnectSocketOut != INVALID_SOCKET)
   { 
     DWORD timeout = 10 * 1000;
      setsockopt(ConnectSocketOut, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout,   sizeof(timeout));
 iResult = send(ConnectSocketOut, lpBuffer, (int)dNoOFBytestoWrite, 0);
    }
    else
    {
        return FALSE;
    }
    if ((iResult == SOCKET_ERROR)||(iResult!= dNoOFBytestoWrite)) {
        int ErrorSt = WSAGetLastError();
        closesocket(ConnectSocketOut);
        WSACleanup();
        ConnectSocketOut = INVALID_SOCKET;
        return FALSE;
    }

    Status = TRUE;


   //Receive data

      int iResult = 0;
    do {

    if (ConnectSocketOut != INVALID_SOCKET) 
    {
              DWORD timeout = 10 * 1000;
              setsockopt(ConnectSocketOut, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));


      iResult = recv(ConnectSocketOut, (char*)&ReceiveData[BytesReceived], 100, 0);
        }
        if (iResult > 0)
        {

BytesReceived += iResult;
   Status = ReceiveData[BytesReceived - 1];         
                  switch (Status)
            {
                case ACK:
                case NAK:
                {

                    AckStatus = ACK_FOUND;
                    break;
                }
                default:
                {
                    Status = UNKNOW_ACK;

                }
            }

        }
        else if (iResult == 0)
        {
            int RetVal = WSAGetLastError();
            Status = UNKNOW_ACK;
            break;
        }
        else
        {
            int RetVal = WSAGetLastError();
        }

    }while ((AckStatus == ACK_NOTFOUND) && (Counter++ < 4));
    if (Status == UNKNOW_ACK)
    {
        closesocket(ConnectSocketOut);
        WSACleanup();
        ConnectSocketOut = INVALID_SOCKET;
    }
    Sleep(1000); 
//初始化TCP
WSADATA WSADATA;
国际结果;
SOCKET ConnectSocket=无效的_套接字;
*ConnectSocketOut=无效的_插座;
clientService[MAX_PRINTERS]中的结构sockaddr_;
//初始化Winsock
iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=无错误){
返回1;
}
//----------------------
//创建用于连接到服务器的套接字
ConnectSocket=socket(主机、SOCK流、IP协议)//IPPROTO_TCP
if(ConnectSocket==无效的_套接字){
WSACleanup();
返回1;
}
//----------------------
//结构中的sockaddr_指定地址族,
//要连接到的服务器的IP地址和端口。
clientService[Index].sin_family=AF_INET;
clientService[Index].sin_addr.s_addr=inet_addr(端口信息[Index].IPAddress);
clientService[Index].sin_port=htons(端口信息[Index].TCPPortNum);
//----------------------
//连接到服务器。
WSASetLastError(0);
iResult=connect(ConnectSocket,(SOCKADDR*)&clientService[Index],sizeof(clientService[Index]);
if(iResult==SOCKET\u错误){
int ErrSt=WSAGetLastError();
闭合插座(连接插座);
WSACleanup();
ConnectSocket=无效的_套接字;
*ConnectSocketOut=ConnectSocket;
返回1;
}
其他的
{
*ConnectSocketOut=ConnectSocket;
}
//发送数据
int-iResult=0;
if(ConnectSocketOut!=无效的_套接字)
{ 
DWORD超时=10*1000;
setsockopt(ConnectSocketOut,SOL_SOCKET,SO_SNDTIMEO,(char*)和timeout,sizeof(timeout));
iResult=send(ConnectSocketOut,lpBuffer,(int)dNoOFBytestoWrite,0);
}
其他的
{
返回FALSE;
}
if((iResult==SOCKET_ERROR)| |(iResult!=dNoOFBytestoWrite)){
int error=WSAGetLastError();
闭合插座(连接插座输出);
WSACleanup();
ConnectSocketOut=无效的_插座;
返回FALSE;
}
状态=真;
//接收数据
int-iResult=0;
做{
if(ConnectSocketOut!=无效的_套接字)
{
DWORD超时=10*1000;
setsockopt(ConnectSocketOut,SOL_SOCKET,SO_RCVTIMEO,(char*)和timeout,sizeof(timeout));
iResult=recv(ConnectSocketOut,(char*)和ReceiveData[BytesReceived],100,0);
}
如果(iResult>0)
{
BytesReceived+=iResult;
状态=接收数据[BytesReceived-1];
开关(状态)
{
案例确认:
案例NAK:
{
AckStatus=ACK\u找到;
打破
}
违约:
{
状态=未知确认;
}
}
}
else if(iResult==0)
{
int-RetVal=WSAGetLastError();
状态=未知确认;
打破
}
其他的
{
int-RetVal=WSAGetLastError();
}
}而((AckStatus==ACK_NOTFOUND)&&(Counter++<4));
如果(状态==未知\u确认)
{
闭合插座(连接插座输出);
WSACleanup();
ConnectSocketOut=无效的_插座;
}
睡眠(1000);

请发布一些代码。请查看TCP初始化的代码,发送数据,接收数据您甚至没有编写您正在使用的编程语言。请提供更多信息,以便人们能够更好地帮助您。请查看编辑的帖子中的代码您正在尝试发送和接收消息,但您似乎没有任何消息协议。这将无法可靠地工作,即使它似乎在某些时候起作用。接收消息的代码在哪里?