2

そこで、基本的な Windows ソケット関数を使用するテスト コードを MSDN サイトからコピーしました。コードは次のとおりです。

#include "stdafx.h"

#ifndef UNICODE
#define UNICODE
#endif

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcipip.h>
#include <wchar.h>


int main()
{

    int iResult = 0;

    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.

    int I = sizeof(sockaddr_in);
        sockaddr_in clientService;
    clientService.sin_family = AF_INET;     
        clientService.sin_port = htons(5000);
    in_addr *s = (in_addr*)malloc(sizeof(in_addr));
    s->s_addr = inet_addr("127.0.0.1");
    clientService.sin_addr = (in_addr_t)s;

    iResult = connect(ConnectSocket, (sockaddr*)&clientService,I);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    wprintf(L"Connected to server.\n");

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}

コードは問題なくコンパイルされます。しかし、プログラムを実行すると、コマンド プロンプト画面に次のエラー メッセージが表示されます。

接続がエラーで失敗しました: 10047

これで、エラー 10047 がアドレス構造のエラーを示していることがわかりました。nを使用してみましたが、関数を使用するinet_ptoとセグメント エラー (メモリ アクセス違反) が発生します。それで、ここで何が起こっているのですか?機能が不適切に実装されていませんか? アドレス構造を指定する別の方法があるかもしれません。inet_ptonmemcpyconnect

4

2 に答える 2

1

MSDNから:http://msdn.microsoft.com/en-us/library/windows/desktop/ms737625%28v=vs.85%29.aspx

sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
clientService.sin_port = htons(27015);

あいまいな方法で.sin_addr.s_addrを設定しているようです。

上記のことが判明した場合、問題はありません。おそらく、IP6プロトコルはオンになっていますが、IP4がないため、AF_NETが失敗し、AF_NET6が必要になります。

于 2013-01-09T19:47:04.470 に答える
0

あなたの場合、問題はここにあるこの行です:

clientService.sin_addr = (in_addr_t)s;

in_addrポインタをin_addrオブジェクトに割り当てています。そのようにポインタを逆参照します(キャストを削除すると、コンパイラが問題をキャッチすることにも注意してください:

clientService.sin_addr = *s;

ただし、LastCoderのアプローチの方が簡単です。malloc()コピーするためだけにin_addr構造を分離する理由はありません。

于 2013-01-09T23:18:43.100 に答える