2012-01-23 11 views
1

Cでソケットプログラミングの宿題に問題があります。私たちはUDPで単純なクライアント/サーバのことをやっていますが、サーバに問題があります。ここでの抜粋です: C UDPソケットが動作しない

int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd, portno; 
    socklen_t clilen; 
    char buffer[PACKET_DATA_LENGTH]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 

はもともと sockfd = socket(AF_NET, SOCK_DGRAM, 0)SOCK_STREAMでしたが、プロジェクトの仕様はTCP UDPではなくそれを行うことだったので、私は DGRAMSTREAMを変更しました。

私は次のようにサーバーを呼び出す:./receiver 1234

そして、私はエラーを取得する:ERROR on accept: Operation not supported on socket

しかし、私は戻ってDGRAMからSTREAMにそれを変更した場合、それはコンパイルし、./receiver 1234が正常に動作します。

ヘルプ?

ありがとうございます!これは、エラーは()のように見えるものである EDIT

-kstruct

void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

EDIT2(これは事前に与えられたコードは、私はそれを書いていない、それがプロジェクトの一部として来ました)ここで私のコードは何ですか(私が投稿したコードの最初のブロックの直後に続きます)。私は定型コードはaccept()を呼び出しますが、その出力メッセージをトリガーしてはいけないと思いますか?つまり、ERROR on acceptではなく、ERROR opening socketと言うべきでしょうか?

bzero((char *) &serv_addr, sizeof(serv_addr)); 
portno = atoi(argv[1]); 
serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = INADDR_ANY; 
serv_addr.sin_port = htons(portno); 
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
     error("ERROR on binding"); 
listen(sockfd,5); 
clilen = sizeof(cli_addr); 
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 
if (newsockfd < 0) 
    error("ERROR on accept"); 
+0

私はあなたの質問を理解していません。あなたは 'ERROR on accept:...'というメッセージを受け取ったと言いますが、* EDIT2 *では 'ERROR opening socket 'というメッセージが表示されますが、' ERROR on accept'というメッセージが表示されます。それはあなたが持っているとあなたが言ったことです。 –

+0

私の悪い、他の方法で、私はそれを修正します。 * EDIT *修正されました。私はコードの残りの部分を見てきましたが、コード内に他のaccept()呼び出しはありません。 – adelbertc

+0

データグラムソケットで 'accept()'を呼び出すことはできません。 'accept()'をまだ呼び出さなかった場合、なぜソケットを開くのにエラーが出ると思いますか? –

答えて

5

UDPはコネクションレスです。なぜあなたはacceptに電話しますか?

+0

私はacceptを明示的に呼び出すことはありません。 'sockfd = socket(AF_INET、SOCK_DGRAM、0)'の副作用である必要がありますが、クライアントで同じ呼び出しをしているのでエラーはありません... – adelbertc

+0

Hrm、より多くのコードを貼り付けることをお勧めします。 'error()'はあなたに良い診断を与えるために 'perror(3)'を呼んでいますか? – sarnold

+0

私のコードの詳細を載せました..それはaccept()を明らかに呼び出します(プロジェクトテンプレートに付属) – adelbertc

0

accept(2) UDPなどのコネクションレスデータグラムプロトコルには意味がありません。 accept(2)は、SOCK_STREAMおよびSOCK_SEQPACKETプロトコルのみです。

You connect(2) UDPプロトコルはカーネルにフィルタリングを提供するよう依頼するが、これは常に望ましいとは限りません。