Ошибка 10057 при работе с сокетами (на си)

цель: установить соединение клиента с сервером, передать и получить сообщение. Но функция recv возвращает ошибку 10057 (Socket is not connected. A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. - это с msdn). В чём собственно дело?

код клиента:


#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <string.h>

#pragma comment(lib, "Ws2_32.lib")

int main(void)
{
    WSADATA wsadata;
    int iResult = WSAStartup(0x202, &wsadata);
    if (iResult != NO_ERROR)
    {
        wprintf(L"WSAStartup func failed with %ld\n", WSAGetLastError());
        return -1;
    }

    SOCKET con = socket(AF_INET, SOCK_STREAM, 0);
    if (con == SOCKET_ERROR)
    {
        wprintf(L"socket func failed with %ld\n", WSAGetLastError());
        WSACleanup();
        return -2;
    }

    struct sockaddr_in addr;

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(27015);

    iResult = connect(con, (SOCKADDR*)&addr, sizeof(addr));

    if (iResult == SOCKET_ERROR)
    {
        wprintf(L"connect func failed with %ld\n", WSAGetLastError());
        closesocket(con);
        WSACleanup();
        return -3;
    }

    char* message = L"some data";

    iResult = send(con, message, (int)strlen(message), 0);
    printf("Sent %d bites", (int)strlen(message));
    if (iResult == SOCKET_ERROR)
    {
        wprintf(L"send func failed with %ld\n", WSAGetLastError());
        closesocket(con);
        WSACleanup();
        return -4;
    }
    return 0;
}

код сервера:


#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <string.h>

#pragma comment(lib, "Ws2_32.lib")

int main(void)
{
    WSADATA wsadata;
    int iResult = WSAStartup(0x202, &wsadata);
    if (iResult != NO_ERROR)
    {
        wprintf(L"WSAStartup func failed with %ld\n", WSAGetLastError());
        return -1;
    }

    SOCKET con = socket(AF_INET, SOCK_STREAM, 0);
    if (con == SOCKET_ERROR)
    {
        wprintf(L"socket func failed with %ld\n", WSAGetLastError());
        WSACleanup();
        return -2;
    }

    struct sockaddr_in addr;

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("0.0.0.0");
    addr.sin_port = htons(27015);

    iResult = bind(con, (SOCKADDR*)&addr, sizeof(addr));
    if (iResult != 0)
    {
        wprintf(L"bind func failed with %ld\n", WSAGetLastError());
        closesocket(con);
        WSACleanup();
        return -3;
    }
    
    iResult = listen(con, SOMAXCONN);
    if (iResult != 0)
    {
        wprintf(L"listen func failed with %ld\n", WSAGetLastError());
        closesocket(con);
        WSACleanup();
        return -4;
    }

    char buff[216];

    SOCKET acceptsocket = accept(con, NULL, NULL);
    if (acceptsocket == INVALID_SOCKET)
    {
        wprintf(L"accept func failed with %ld\n", WSAGetLastError());
        closesocket(con);
        WSACleanup();
        return -5;
    }
    int length = recv(con, buff, 216, 0);
    if (length <= 0)
    {
        wprintf(L"recv func failed with %ld\n", WSAGetLastError());
        closesocket(con);
        WSACleanup();
        return -6;
    }
    wprintf(L"%s", buff);

    closesocket(con);
    WSACleanup();
    return 0;
}


Ответы (1 шт):

Автор решения: Fat-Zer
int length = recv(con, buff, 216, 0);

Здесь recv() нужно делать из сокета, который вернул accept() т.е. acceptsocket.

→ Ссылка