TCPを使う(acceptした相手の確認)

TCPサーバはlistenした後にクライアントからのコネクションをacceptしますが、どのクライアントからのコネクションをacceptしたかを知りたい場合があると思います。 ここでは、接続相手を確認する方法を説明したいと思います。

acceptした相手を表示するサンプル

acceptの第二引数は、接続した相手に関する情報を含んでいます。 以下のサンプルは、acceptした相手のIPアドレスとポート番号を表示します。 IPアドレスの表示にはinet_ntoaを利用します。 inet_ntoaは、引数として渡したstruct in_addrを表現する文字列を返します。


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

int
main()
{
 WSADATA wsaData;
 SOCKET sock0;
 struct sockaddr_in addr;
 struct sockaddr_in client;
 int len;
 SOCKET sock;

 WSAStartup(MAKEWORD(2,0), &wsaData);

 sock0 = socket(AF_INET, SOCK_STREAM, 0);

 addr.sin_family = AF_INET;
 addr.sin_port = htons(12345);
 addr.sin_addr.S_un.S_addr = INADDR_ANY;

 bind(sock0, (struct sockaddr *)&addr, sizeof(addr));

 listen(sock0, 5);

 while (1) {
   len = sizeof(client);
   sock = accept(sock0, (struct sockaddr *)&client, &len);

   printf("accepted connection from %s, port=%d\n",
          inet_ntoa(client.sin_addr), ntohs(client.sin_port));

   send(sock, "HELLO", 5, 0);

   closesocket(sock);
 }

 WSACleanup();

 return 0;
}

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!