首页 > 解决方案 > recv() 返回 -1(失败并出现 10054 错误)

问题描述

当我的客户端向服务器发送请求(两者都是用 C 编写的)recv()时,客户端失败并出现错误 10054 ( WSAECONNRESET)。我的服务器是在定义的端口上运行的 Windows 服务。

建立连接,双方都创建了套接字,但是在发送/接收时,我遇到了这个问题:/

---> 服务器代码 <----

WSADATA wsa;
SOCKET MainSock, AcceptSock;
int c = sizeof(struct sockaddr_in);
char client_req[1024] = { 0 };
int req_size;
char *end = NULL;

if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0)
{
    fprintf(fptr, " WSAStartup Failed. Error Code : %d", WSAGetLastError());
    return 1;
}

//Create a socket
if ((MainSock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    fprintf(fptr, " Could not create socket : %d\n", WSAGetLastError());

//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;    //inet_addr("10.10.1.18"); 
server.sin_port = htons(PORT);

//Bind
if (bind(MainSock, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    fprintf(fptr, " Bind failed with error code : %d\n", WSAGetLastError());

//Listen to incoming connections
if ((listen(MainSock, SOMAXCONN)) == SOCKET_ERROR)
    fprintf(fptr, " listen failed with error code : %d\n", WSAGetLastError());

//Accept and incoming connection
fprintf(fptr, "\n\n Waiting for incoming connections...");

if ((AcceptSock = accept(MainSock, (struct sockaddr *)&client, &c)) != INVALID_SOCKET)
{
    fprintf(fptr, "\n Connection accepted on %s", getCurrTime());

    req_size = recv(AcceptSock, client_req, 1024, 0);

    if (req_size > 0)
    {
        //stuff to do
    }                              
}

---> 客户代码 <----

char *ReturnedData = CreatePacket();
encrypt(ReturnedData);

if ((sent_bytes = send(ServiceSock, ReturnedData, strlen(ReturnedData), 0)) < 0)
{
    err = GetLastError();
    DisplayError = malloc(MINCHAR * sizeof(char));
    sprintf(DisplayError, "Unable to communicate. (%d)", err);
    MessageBox(NULL, DisplayError, "Error!", MB_ICONEXCLAMATION | MB_OK);
    free(DisplayError);
    return err;
}

if ((recv_size = recv(ServiceSock, Service_reply, 10000, 0)) == SOCKET_ERROR)   //Failed here with 10054
{
    err = WSAGetLastError();
    DisplayError = malloc(MINCHAR * sizeof(char));
    sprintf(DisplayError, "Unable to receive information. (%d)", err);
    MessageBox(NULL, DisplayError, " Error!", MB_ICONEXCLAMATION | MB_OK);
    free(DisplayError);
    return err;
}
else
{
    //stuff to do
}

标签: csocketswinsock

解决方案


推荐阅读