0

winsock を使用してピアツーピア通信を実現しようとしていますが、gethostbyaddr常に NULL を返します。これはローカルホストでのみ機能し、server_name は宛先 IP アドレスです。

server_name="<--ipaddress-->"

struct sockaddr_in server;
addr = inet_addr(server_name);
cout<<"inet_addr(server_name) "<<addr<<endl;
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
memset(&server, 0, sizeof(server));


memcpy(&(server.sin_addr), hp->h_addr, hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

Python を使用して既に p2p 通信を実現しており、同じポート番号とアドレスで完全に正常に動作します..手がかりをありがとう..

C ++でそれを行う方法がわかりません.pythonで bind(---) を使用しました。

4

1 に答える 1

1

どこserver_nameから来たの?有効な IP アドレスだと確信していますか? また、WSAGetLastError()何が問題なのかを具体的に確認してください。

すべてのホスト名に逆引き DNS エントリがあるわけではないことに注意してください。gethostbyaddr実際の有効な IP アドレスで失敗することは完全に正当です。p2p を実行している場合は、ホスト名にまったく依存しないことをお勧めします。ただし、おそらく診断表示の場合を除きます (逆引きが失敗した場合は IP アドレスにフォールバックします)。

編集:あなたの新しく拡張されたコードサンプルでは、​​実際にはまったく必要ないことは明らかですgethostbyaddr

struct sockaddr_in server;
memset((void*)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.S_un.S_long = inet_addr(server_name);
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

gethostbyaddr問題のサーバーの逆引き DNSが必要な場合にのみ必要です。inet_addr接続するための適切なアドレスがすでに提供されています。

于 2009-09-26T04:47:37.807 に答える