首页 > 解决方案 > TCP 连接在 recv() 函数处失败

问题描述

我是套接字编程的新手。

我正在尝试通过遵循某种协议在服务器和客户端之间进行 TCP 接口。

建立连接后,客户端向服务器发送一定的数据包开始通信。recv()我的程序在客户端的功能上失败了。

让我分享一下我的代码的客户端:

iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0)
{
    printf("WSAStartup failed with error: %d\n", iResult);
    return 1;
}

ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

iResult = getaddrinfo(LOCAL_IP, "8081", &hints, &result);
if (iResult != 0)
{
    printf("getaddrinfo failed with error: %d\n", iResult);
    WSACleanup();
    return 1;
}

// Attempt to connect to an address until one succeeds
for (ptr = result; ptr != NULL; ptr = ptr->ai_next)
{
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
                           ptr->ai_protocol);
    if (ConnectSocket == INVALID_SOCKET)
    {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    // Connect to server.
    iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (iResult == SOCKET_ERROR)
    {
        closesocket(ConnectSocket);
        ConnectSocket = INVALID_SOCKET;
        continue;
    }
    break;
}

MSG_PDDAU_INFO_PACKET* ps8ptr = new MSG_PDDAU_INFO_PACKET;
memset(ps8bufrecv, 0, DEFAULT_BUFLEN);
s32packetlen = sizeof(MSG_PDDAU_INFO_PACKET);           
printf("size %d\n", sizeof(MSG_PDDAU_INFO_PACKET));
iResult = recv(ConnectSocket, ps8bufrecv, s32packetlen, 0);        
if (iResult == -1)
{
    printf("Here !\n");
    fprintf(stderr, "recv Error Occurred %s (%d)\n", strerror(errno), errno);
    return -1;
}
memcpy(ps8ptr,ps8bufrecv,sizeof(MSG_PDDAU_INFO_PACKET));

这是代码的服务器端:

nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
serv_sock = socket(PF_INET, SOCK_STREAM, 0);

if(serv_sock == -1)
{
    printf( "socket() Error..Error --> Code %d ", WSAGetLastError() );
    error_handling("socket error");
}
memset(&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = PF_INET;
serv_addr.sin_addr.s_addr = inet_addr(ip);
serv_addr.sin_port = htons(CLIENT_PORT_NUMBER);

if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)
{
    printf( "bind() Error..Error --> Code %d ", WSAGetLastError() );
    error_handling("bind error");
}
if(listen(serv_sock, 5) == -1)
{
    printf( "listen() Error..Error --> Code %d ", WSAGetLastError() );
    error_handling("listen error");
}

clnt_addr_size = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if(clnt_sock == -1)
{
    printf( "accept() Error..Error --> Code %d ", WSAGetLastError() );
    error_handling("accept error");
}

MSG_PDDAU_INFO_PACKET* ps8ptr = new MSG_PDDAU_INFO_PACKET;
ps8ptr->header.msg_id = MSG_PDDAU_INFO_ID;
ps8ptr->header.msg_type = MSG_REQUEST_TYPE;
ps8ptr->time_enable = 0x01;
s32packetlen = sizeof(MSG_PDDAU_INFO_PACKET);
memset(ps8bufsend, 0, DEFAULT_BUFLEN);
memcpy(ps8bufsend,ps8ptr, s32packetlen);                    
iResult = send(clnt_sock, ps8bufsend, s32packetlen, 0);   
if (iResult == -1)
{
    fprintf(stderr, "send Error Occurred %s (%d)\n", strerror(errno), errno);
    return -1;
} 

recv代码在连接后的第一个/接口处一直失败,send错误信息如下所示。

服务器端:

Time msg id : 5
Time setting failed

客户端:

recv Error Occurred Invalid argument (22)

我不知道在我的情况下正确的沟通方式是什么。

如果有人能在这里指出我的问题,那就太好了。

标签: socketstcp

解决方案


推荐阅读