2012-05-25 4 views
9

私はUDPサーバをC言語で書こうとしています(Linuxの場合)。私は、socket()関数では、SOCK_DGRAMを使用し、SOCK_STREAMを使用してはならないことを知っています。私はプログラム(コンパイルでエラーなし)を実行しようとすると、CでUDPサーバーを作成するには?

if ((list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
{ 
    fprintf(stderr, "ERROR"); 
} 

しかし、今は、それがlisten()にエラーがあることを述べています。ここにそれがあります:

if (listen(list_s, 5) < 0) 
{ 
    fprintf(stderr, "ERROR IN LISTEN"); 
    exit(EXIT_FAILURE); 
} 

あなたは問題が何かを理解できますか?

int  list_s;    /* listening socket   */ 
int  conn_s;    /* connection socket   */ 
short int port;     /* port number    */ 
struct sockaddr_in servaddr; /* socket address structure */ 

if ((list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
{ 
    fprintf(stderr, "ERROR\n"); 
} 

memset(&servaddr, 0, sizeof(servaddr)); 
servaddr.sin_family  = AF_INET; 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servaddr.sin_port  = htons(port); 

if (bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) 
{ 
    fprintf(stderr, "ERROR IN BIND \n"); 
} 

if (listen(list_s, 5) < 0)  // AL POSTO DI 5 LISTENQ 
{ 
    fprintf(stderr, "ERROR IN LISTEN\n"); 
    exit(EXIT_FAILURE); 
} 
+1

一般的な発言として、多くの関数はerrnoで発生したエラーの詳細を表示します。 errnoをチェック(およびログ)することは常に賢明です - strerrorも参照してください。 – fvu

+0

オフトピック: '//'コメントはC++では許可されていますが、C言語では許可されません。 –

+2

@EitanT彼らはC99の一部です – fvu

答えて

22

あなたは、それは単にそれのために定義されていないではないlistenデータグラムソケット上のことができます。これは、コードです。 bindが必要で、ループで読み始めます。

簡単な説明として、listenは、そのソケットに接続があると予想し、後で受け入れることをOSに通知します。明らかに、それはデータグラムソケットには意味がないので、エラーです。


サイドノート:あなたはこのようなエラーを印刷するperrorを使用するようにしてください。この場合は、操作がサポートされていない可能性があります()。

3

UDPソケットのlisten(2)に@cnicutarという言葉は必要ありません。これはTCP用です。ちょうどrecv(2)またはrecvfrom(2)

関連する問題