2

ソケットプログラミングを学び、以下はエラー箇所の切り貼りです。

参考までに、私はこのチュートリアルに従っていました。

未処理のgethostbyname()返品struct hostent

struct hostent *gethostbyname(const char *name);

次のコードで。

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/socket.h>
  4 #include <netinet/in.h>
  5 #include <stdlib.h>
  6 #include <strings.h>
  7 
  8 int main(int argc, char *argv[])
  9 {
 10     int sockfd, portno, n;
 11     struct sockaddr_in serv_addr;
 12     struct hostent *server;
 13 
 14     server = gethostbyname(argv[1]);
 15 
 16     /* compose serv_addr */
 17     bzero( (char *)&serv_addr, sizeof(serv_addr) );
 18     serv_addr.sin_family = AF_INET;
 19     bcopy( (char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
 20     serv_addr.sin_port = htons(portno);
 21 
 22     return 0;
 23 }

次のgccエラー/警告があります

$gcc client2.c
client2.c: In function ‘main’:
client2.c:14: warning: assignment makes pointer from integer without a cast
client2.c:19: error: dereferencing pointer to incomplete type
client2.c:19: error: dereferencing pointer to incomplete type

私が間違っていることを教えてください。

4

2 に答える 2

9

これを一番上に追加してみてください:

#include <netdb.h>

に必須のインクルードですgethostbyname。コマンドラインで入力man gethostbynameすると、次のようなマニュアルページが表示されます。

のScreenie

マンページには、含める必要のあるヘッダーの詳細が記載されています(SYNOPSISの下)。

q(終了するためにヒットしますman。)

于 2012-05-11T23:43:45.600 に答える
5

マンページの注bzero(3):

   4.3BSD.  This function is deprecated (marked as LEGACY in
   POSIX.1-2001): use memset(3) in new programs.  POSIX.1-2008
   removes the specification of bzero().

memset(3)代わりに必ず使用する必要がbzero(3)あります -- API はわずかに冗長ですが、完全にひどいわけではありません。bcopy(3)とについても同じ話ですmemcpy(3)

memset(3)でありmemcpy(3)、 で<string.h>はない<strings.h>ので、それも変更します。

コードで使用しているキャストが多すぎます。関数のプロトタイプに が含まれている場合、void *任意のポインター型をパラメーターとして受け入れ、コンパイラーは型を正しく追跡します。キャストを追加すると、コンパイラはあなたがよく知っていることを知ることができ、実際のエラーや警告が隠されることがよくあります。

また、ヘッダーもgethostbyname(3)必要であることに注意してください。<netdb.h>

これらの変更を行うと、コードはより少ない警告でコンパイルされます。

$ CFLAGS="-Wall -Wextra" make client2
cc -Wall -Wextra    client2.c   -o client2
client2.c: In function ‘main’:
client2.c:11:25: warning: unused variable ‘n’ [-Wunused-variable]
client2.c:11:9: warning: unused variable ‘sockfd’ [-Wunused-variable]
client2.c:9:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
client2.c:21:31: warning: ‘portno’ is used uninitialized in this function [-Wuninitialized]

(それらのどれも驚くべきものではありません。これは進行中のコードです。ゆっくりとコードを作成しようとしてくれてありがとう...)

于 2012-05-11T23:50:38.867 に答える