11

UDP サーバーを C (Linux で) で作成しようとしています。私はsocket()関数で私が使用SOCK_DGRAMしなければならないことを知っていSOCK_STREAMます。

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);
}
4

2 に答える 2

24

データグラムソケットではできませんlisten。単に定義されていません。bindループで読み始めるだけです。

簡単な説明として、そのソケットでの接続listenを期待する必要があること、および後でそれらを受け入れることを OS に通知します。明らかに、これはデータグラム ソケットには意味がないため、エラーが発生します。


補足:perrorこのようなエラーを出力するには、 を使用してみてください。この場合、(おそらく) Operation not supportedと言ったでしょう。

于 2012-05-25T17:10:35.730 に答える
5

listen(2)@cnicutarが言及しているように、TCP用のUDPソケットを使用する必要はありません。ちょうどrecv(2)またはrecvfrom(2)

于 2012-05-25T17:14:27.877 に答える