-1

私はプロキシサーバーで作業しています。別の「モニター」プログラムに接続し、そのプログラムから接続アドレス情報を取得する必要があります。そのプログラムは、既知の IP とポートで実行されています。以下を使用して接続すると、正常に動作します。

struct hostent *serv;
int sockfd;
struct sockaddr_in serv_addr;

serv = gethostbyname("localhost");
sockfd = socket(AF)INET, SOCK_STREAM, 0);
   if (sockfd < 0)
      /*   Error handling    */ 
bzero((char *) &serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno); // portno is an int holding the port number
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
   /*    error handling   */

ただし、ローカル ホストの代わりに正確な IP アドレスを使用したかったため、常に同じマシン上にあるとは限らず、gethostbyname () は廃止されました。次のように getaddrinfo() を使用しようとしました。

struct addrinfo hints, *server;
int sockfd, i;
char *host = "192.168.2.4";
char *port = "4044";

memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = 0;
hints.ai_protocol = IPPROTO_TCP;  // have also tried it with 0
i = getaddrinfo(host, port, &hints, &server);
if (i != 0) 
   /*    Error handling   */
sockfd = socket(server->ai_family, server->ai_socktype, server->ai_protocol);
freeaddrinfo (server); // have also tried without this line
if (sockfd < 0)
   /*   Error handling    */
printf("Attempting to connect\n");
if (connect(sockfd, server->ai_addr, server->ai_addrlen) != -1) 
   /*    Error handling   */ 
printf("Connection attempt complete\n");

この 2 回目の試行は、connect() コマンドで長時間ハングし、最終的にエラーになります。私はいくつかの場所で例を調べ、stackoverflow で以前の質問を検索しましたが、問題を見つけることができません。server->ai_addr の値と関係があると思いますが、まだ確認できていません。

何か助けていただければ幸いです。私は明らかに間違ったことをしていますか? チェックするアイデアを他にどこで探すべきかわかりません。

編集の更新: 1 つの問題を見つけました。if (connect (/* */) != -1) の行では、!= 0 である必要がありました。私が見たサンプルの 1 つは、代わりに bind() ステートメントを使用していました。2番目のローカルホストアドレスを使用すると、その変更で機能します。ただし、特定の IP アドレス ノードにはまだ接続できません。与えられた IP アドレスは、このコンピュータがネットワーク トラフィックを受信できるものではないのではないかと疑い始めています。私はそれを確認する方法がわかりません。特定のIPアドレスを使用してエラーに関する詳細を把握し、その情報で再度編集できるかどうかを確認します.

編集の更新: #include を追加し、システム コールが返された後にエラー コードを出力しようとしました。リターンもプリントアウトしました。これは -1 を返します。これは、私が見つけたドキュメントによると、セグメント障害のエラー番号を出力しようとしたときにエラーが発生したことを意味します。

fprintf(stderr, "Error Code %s\n", errno); // seg faults

ただし、次のように変更します。

fprintf(stderr, "Error Code %d\n", errno); // returns Error Code 60
4

2 に答える 2

0

与えられた IP アドレスは、使用しているコンピューターの IP ではありません。最終的に、IPアドレスが問題であるに違いないと判断しました。私は自分のコンピューターで IP アドレスを見つけ、サーバー プログラムをそれにバインドさせました。また、ローカルホストの代わりに上記のコードのIPアドレスとして入力したところ、サーバーがその特定のIPアドレスにあるか、単にINADDR_ANYに接続されているかに関係なく接続できました。

于 2013-04-26T07:00:39.050 に答える
0

交換してみる

hints.ai_flags = 0;

hints.ai_flags = AI_NUMERICHOST;

そして何が起こるか見てください。

于 2013-04-24T17:34:01.237 に答える