Я новичок в программировании Winsock и наткнулся на этот код, читая книгу «Сетевое программирование для Microsoft Windows». Но похоже, что этот код не может подключиться к клиенту. Пожалуйста, скажите мне, как я могу решить эту проблему.
Код моего сервера:
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int main(){
WSADATA wsadata;
int ret;
if ((ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0){
cout << "Wsastartup failed" << endl;
}
else{
cout << "connection made successfully" << endl;
}
SOCKET ListeningSocket, NewConnection;
SOCKADDR_IN ServerAddr, ClientAddr;
int port = 80;
ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(port);
inet_pton(ServerAddr.sin_family,"127.0.0.1",&ServerAddr.sin_addr.s_addr);
int res= bind(ListeningSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));
if (res == SOCKET_ERROR){
cout << "binding failed" << endl;
}
res = listen(ListeningSocket,5);
if (res == SOCKET_ERROR){
cout << "Listening failed" << endl;
}
int c = 1;
NewConnection= accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&c);
if (NewConnection == INVALID_SOCKET){
cout << "COULD not CONNECT TO CLIENT . err code : "<<WSAGetLastError() << endl;
}closesocket(ListeningSocket);
if (WSACleanup() == SOCKET_ERROR){
cout << "WSACleanup failed with error : " << WSAGetLastError() << endl;
}
else{
cout << "WinSock data cleaned successfully" << endl;
}
cin.get();
}
При запуске этого кода отображается «НЕ МОЖЕТ ПОДКЛЮЧИТЬСЯ К КЛИЕНТУ. Код ошибки 10014».
Я нашел это описание кода ошибки в центре разработки Windows:
Неверный адрес.
Система обнаружила неверный адрес указателя при попытке использовать аргумент указателя вызова. Эта ошибка возникает, если приложение передает недопустимое значение указателя или длина буфера слишком мала. Например, если длина аргумента, который является sockaddr
структура, меньше, чем sizeof(sockaddr).
Как я могу исправить эту ошибку?
Когда вы звоните accept
переменная, на которую указывает третий параметр, должна содержать размер буфера, на который указывает второй параметр. (Когда accept
возвращает, он будет содержать объем фактически используемого пространства)
В вашем коде измените:
int c = 1;
в
int c = sizeof(ClientAddr);