3

ポートをリッスンしているサーバーがあります

sockfd = socket(PF_INET6,SOCK_STREAM,IPPROTO_TCP);
memset(&addr,0,len = sizeof(addr));
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(2000);
addr.sin6_flowinfo = 0;
addr.sin6_scope_id = 0;
addr.sin6_addr = in6addr_any;

bind(sockfd,(struct sockaddr*)&addr,len);
listen(sockfd,4);

受付待ちです

.....    
socket = accept(sockfd,(struct sockaddr*)&addr,&len);

netstat -tan で "tcp 0 0 :::2000 :::* LISTEN " を見ました

そして、そのサーバーに接続しようとしているクライアントがありますが、エラー connect() が発生し、接続が拒否されました

memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(2000);

if ((sockfd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) == -1)
     printf("ERROR opening socket\n");

memset(buffer,0x00,sizeof(buffer));

ここでバッファを埋めます。

if (connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)) < 0)
 printf("connect() failure, %s-\n", strerror(errno));

telnet xx.xx.xx.xx 2000 で接続できます。このコードの何が問題なのですか?

4

1 に答える 1

0

IP6 サーバーに接続するには、クライアントは IP6 接続の確立を試みる必要があります。

したがって、これを変更したい場合があります。

addr.sin_family = AF_INET;
addr.sin_port = htons(2000);
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

することが:

addr.sin6_family = AF_INET6;
addr.sin6_port = htons(2000);
addr.sin6_addr = in6addr_loopback;

telnet クライアントはおそらく内部的に使用getaddrinfo()して、telnet のコマンド ラインで指定された IP4 アドレスを介して指定されたホストに IP6 サービスが利用可能かどうかを問い合わせます。


bind() ところで: andの最後のパラメータconnect()は 型socklen_tです。への最後のパラメータaccept()はタイプsocklen_t *です。

于 2012-11-20T08:09:49.607 に答える