4

msdn のこの記事 ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs.85).aspx ) によると、選択したプロトコルによって構造体が異なります。

http://www.intelliproject.net/articles/showArticle/index/check_tcp_udp_portのこのコードを使用して、ポートが開いているかどうかを確認します。

今、私は次のような構造体 sockaddr を持っています:

struct sockaddr {
    ushort  sa_family;
    char    sa_data[14];
};

しかし、この構造が必要です:

struct sockaddr {
    short   sin_family;
    u_short sin_port;
    struct  in_addr sin_addr;
    char    sin_zero[8];
};

どの変更が必要ですか?

(Ws2_32.lib がリンクされており、以下が含まれています

#define WIN32_LEAN_AND_MEAN

// sockets
#include "windows.h"
#include <winsock2.h>
#include <ws2tcpip.h>

どうも

4

1 に答える 1

7

ソケット API では、使用するアドレス構造はプロトコルによって異なります。IPv4 を使用している場合、必要な構造はsockaddr_in.

ソケット APIvoid *は、標準ではなかったずっと前に登場しました。へのポインターは、ポインターをsockaddr使用する場合とまったく同じ方法で、ソケット関数全体で使用されvoid *ます。関数は、使用するプロトコルに関連する構造体へのポインターを渡すことを想定しています。不快なのは、アドレス構造体へのポインターを渡すたびにキャストが必要になることですが、それに対してできることは何もありません。

IPv4 の例:

struct sockaddr_in address;

// ...

memset( &address, 0, sizeof(address) );

address.sin_family = AF_INET;
address.sin_port = htons(1100);
address.sin_addr.s_addr = INADDR_ANY;

if ( bind( sock, (struct sockaddr *)&address, sizeof(address) ) < 0 )
{
   //....
}
于 2012-10-24T11:05:20.313 に答える