Исключение с сокетом окон. Нарушение прав чтения
Просто пытаюсь открыть сокет с помощью winsock. Я получаю из Visual Studio сообщение об ошибке, в которой говорится о нарушении прав чтения ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
Весь мой код там:
ListenSocket = INVALID_SOCKET;
ClientSocket = INVALID_SOCKET;
WORD wVersionRequested;
WSADATA wsaData;
int wsaerr;
wVersionRequested = MAKEWORD(2, 2);
wsaerr = WSAStartup(wVersionRequested, &wsaData);
if (wsaerr != 0)
{
printf("Server: The Winsock dll not found!\n");
WSACleanup();
return 0;
}
else
{
printf("Server: The Winsock2 dll found \n");
}
/* SOCKET is simply a UINT, created because
on Unix sockets are file descriptors(UINT) but not in windows
so new type SOCKET was created */
cout << AF_INET << endl ;
cout << SOCK_STREAM << endl ;
cout << IPPROTO_TCP << endl ;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ListenSocket == INVALID_SOCKET)
{
cerr << "Server: Error initializing socket!n" << endl;
WSACleanup();
return 0;
}
/* The SOCKADDR_IN structure is used by
Win Sockets to specify an endpoint address
to which the socket connects */
sockaddr_in service,client ;
service.sin_family = AF_INET;
service.sin_port = htons(port);
service.sin_addr.s_addr = INADDR_ANY;
/* bind just links the socket
with the sockaddr_in struct we initialized */
if(bind(ListenSocket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
printf("Server: Error binding socket to port \n");
WSACleanup();
return 0;
}
/* wait for incoming connections */
if(listen(ListenSocket,10)==SOCKET_ERROR)
printf("listen(): Error listening on socket %d\n", WSAGetLastError());
else
{
printf("Server: Waiting for connections...\n");
}
/* accept connections */
printf("Server: Waiting for a client to connect...\n");
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
} else {
wprintf(L"Client connected.\n");
acceptConns();
}
Хотел бы получить помощь по этому вопросу, потому что я не могу понять, почему это не работает.
заранее спасибо
РЕДАКТИРОВАТЬ: я создаю этот сервер в потоке со следующим кодом. Казалось бы, это причина, почему я получаю ошибку в первую очередь
DWORD WINAPI myThread(LPVOID lpParameter)
{
tcp_server* server = (tcp_server*)lpParameter ;
server->start_listening(); // The above function
return 0 ;
}
.....
HANDLE myHandle = CreateThread(0, 0, myThread, server, 0,NULL);
1 ответ
У меня есть нарушение прав на чтение
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
В этой строке нет явного доступа для чтения.
Однако, как показано в коде (который является неполным для диагностических целей), внутри метода класса tcp_server::start_listening()
, а также ListenSocket
предположительно является членом этого класса, и вы звоните start_listening()
через tcp_server
указатель на объект, который передается потоку
единственное чтение, которое может происходить, - это доступ неявного
this
указатель при назначенииListenSocket
член.tcp_server
объект, на который указывают, скорее всего, недействителен в памяти ко времени вызова потокаstart_listening()
(или, по крайней мере, когдаsocket()
вызывается, так как вы инициализируетеListenSocket
заранее). Если бы это было правдой, присваиваяListenSocket
было бы неопределенным поведением, которое МОЖЕТ вызвать ошибки нарушения доступа (среди других видов ошибок, если они вообще есть).
Тем не менее, вы не показали, как вы создаете server
объект перед вызовом CreateThread()
или что вы делаете с объектом после CreateThread()
выходы, так что это рассуждение является (образованным) предположением, если только вы не покажете более полный пример кода.