Я столкнулся с проблемой с функцией accept() в приведенном ниже коде. Постоянно выдает ошибку 10038. Прочитал об ошибке 10038 (WSAENOTSOCK). Но я не могу найти точную проблему здесь. Подобный код Linux отлично работает как серверный код.
PS: я запускаю это в Visual Studio в Windows.
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
int main(int argc, _TCHAR* argv[])
{
FILE* fp = fopen("ClientServerThread.log", "a+");
SOCKET serverSocket;
struct sockaddr_in serverAddr;
WSADATA wsaData;
int nCode;
if ((nCode = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
fprintf(fp, "%s: %d\n", "WSAStartup() failed with code", nCode);
fclose(fp);
return false;
}
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET)
{
fprintf(fp, "%s: %ld\n", "socket() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8000);
serverAddr.sin_addr.s_addr = INADDR_ANY;
int bindRes = bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if (bindRes == SOCKET_ERROR)
{
fprintf(fp, "%s: %ld\n", "bind() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
int listenRes = listen(serverSocket, 10);
if (listenRes == SOCKET_ERROR)
{
fprintf(fp, "%s: %ld\n", "listen() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
fprintf(fp, "%s...\n", "Server listening for client");
while (1)
{
int clientSock = accept(listenRes, (struct sockaddr*)&serverAddr, (int*)sizeof(serverAddr));
if (clientSock == SOCKET_ERROR)
{
//10038
fprintf(fp, "%s: %ld\n", "accept() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
fprintf(fp, "%s: %d\n", "Client Found", clientSock);
closesocket(clientSock);
}
fclose(fp);
}
Любая помощь будет оценена по достоинству. Заранее спасибо.
Код ошибки WSAENOTSOCK
кажется очевидным. У вас есть...
int listenRes = listen(serverSocket, 10);
с последующим...
int clientSock = accept(listenRes, ...
Таким образом, вы передаете значение, возвращаемое listen
, в качестве параметра сокета в accept
. Ваш звонок accept
должен быть (не проверен)...
int clientSock = accept(serverSocket, (struct sockaddr*)&serverAddr, (int*)sizeof(serverAddr));