Ошибка 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.