-5

重複の可能性:
Linux から Windows への tcp 経由の接続

windows/c# に TCP クライアントがあり、linux/c++ に別の TCP クライアントがあります。また、両方に TCP サーバーがあります。

Windows/C# の TCP クライアントは正常に動作します。問題は、Linux/C++ の TCP クライアントです。

linux/c++ で TCP サーバーに接続すると完全に動作しますが、windows/c# で TCP サーバーに接続しようとすると接続しませんが、ping は問題ありません。

これは、失敗するコードの一部です。

int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;  
struct in_addr addr={0};
char buffer[256];
if (argc < 3) {
   fprintf(stderr,"usage %s hostname port\n", argv[0]);
   exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) 
    error("ERROR opening socket");
addr.s_addr=inet_addr(argv[1]);
server = gethostbyaddr((char *) &addr, 6, AF_INET);
if (server == NULL) {
    fprintf(stderr,"ERROR, no such host\n");
    exit(0);

問題は次の行です。

server = gethostbyaddr((char *) &addr, 6, AF_INET);

null を返すため、「ERROR,no such host」と出力されます。

私はすべての組み合わせを試しました:

-TCPクライアント(Linux)からTCPサーバー(Linux)へ

-TCPクライアント(linux)からTCPサーバー(windows)へ

-TCP クライアント (Windows) から TCP サーバー (Linux) へ

-TCP クライアント (windows) から TCP サーバー (windows) へ

TCP クライアント (Linux) から TCP サーバー (Windows) を除くすべてが機能します。

また、TCPクライアントnetcat(Linuxに含まれる)をTCPサーバー(Windows)に試してみましたが、動作します。

WindowsからLinuxへ、またLinuxからWindowsへの両方でpingを呼び出しましたが、100%受信しました

TCP クライアント (Linux) が TCP サーバー (Linux) に接続しない理由がわかりません

4

1 に答える 1

0

gethostbyaddr()が特定のアドレスのホスト名を判別するには、DNSなどの何らかのネームサービスが必要です。WindowsからLinuxに移行する場合、これには明らかに問題があります。一般に、私はこの方法でホスト名を解決することに関して多くの信頼性の問題を抱えており、それを使用しないことをお勧めします。DTBが指摘したように、接続に必要なのはIPアドレスだけです。他の理由でホスト名が必要な場合、最も安全な方法は、クライアントが最初に接続したときにサーバーにホスト名を送信させることです(またはその逆)。

于 2012-05-10T18:45:42.703 に答える