-1

私は Winsock プログラミングの初心者で、本「Network Programming For 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();
}

このコードを実行すると、「COULD not CONNECT TO CLIENT.err code 10014」と表示されます。Windows dev center でこのエラー コードの説明を見つけました: アドレスが正しくありません。

システムは、呼び出しのポインター引数を使用しようとしたときに、無効なポインター アドレスを検出しました。このエラーは、アプリケーションが無効なポインター値を渡す場合、またはバッファーの長さが小さすぎる場合に発生します。たとえば、sockaddr構造体である引数の長さがsizeof(sockaddr).

このエラーを修正するにはどうすればよいですか?

4

1 に答える 1

1

を呼び出すときaccept、3 番目のパラメーターが指す変数は、2 番目のパラメーターが指すバッファーのサイズを保持する必要があります。(accept返却時は実際に使用した容量を保持します)

コードで、次を変更します。

int c = 1;

int c = sizeof(ClientAddr);
于 2015-08-16T09:45:45.007 に答える