2015-08-16 5 views
-1

Я новичок в программировании Winsock и натолкнулся на этот код, читая книгу «Сетевое программирование для Microsoft Windows». Но, похоже, этот код не может подключиться к клиенту. Скажите, пожалуйста, как я могу исправить эту проблему.Почему этот код WinSock не подключается к клиенту?

Мой код сервера:

#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.». Я нашел это описание кода ошибки в окнах dev center: Плохой адрес.

Система обнаружила неверный адрес указателя при попытке использовать аргумент указателя вызова. Эта ошибка возникает, если приложение передает недопустимое значение указателя или длина буфера слишком мала. Например, если длина аргумента, которая является структурой sockaddr, меньше, чем sizeof(sockaddr).

Как исправить эту ошибку?

+0

если ошибка возникает в [принимать] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx), он вернет INVALID_SOCKET, а не SOCKET_ERROR. попробуйте напечатать точный код ошибки или смысл. –

+0

@NaveenKumar Я отредактировал код и использовал INVALID_SOCKET вместо SOCKET_ERROR, но все еще получаю ту же ошибку. –

+0

Из сообщения об ошибке вы знаете, что сбой происходит в вызове 'accept'. Если посмотреть на документацию [accept function] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526.aspx), мы увидим, что при возникновении ошибки возвращается значение INVALID_SOCKET и конкретный код ошибки можно получить, вызвав WSAGetLastError. ". Мы также можем увидеть таблицу возможных кодов ошибок и их значение. Поскольку @NaveenKumar предложил вам получить эту конкретную ошибку, чтобы узнать больше о сбое 'accept'. –

ответ

1

Когда вы вызываете accept, переменная, указанная третьим параметром, должна содержать размер буфера, на который указывает второй параметр. (Когда accept вернется, он будет держать объем пространства, фактически используемого)

В коде изменения:

int c = 1; 

в

int c = sizeof(ClientAddr);