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ではなくそれを行うことだったので、私は
DGRAM
へ
STREAM
を変更しました。
私は次のようにサーバーを呼び出す:./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");
私はあなたの質問を理解していません。あなたは 'ERROR on accept:...'というメッセージを受け取ったと言いますが、* EDIT2 *では 'ERROR opening socket 'というメッセージが表示されますが、' ERROR on accept'というメッセージが表示されます。それはあなたが持っているとあなたが言ったことです。 –
私の悪い、他の方法で、私はそれを修正します。 * EDIT *修正されました。私はコードの残りの部分を見てきましたが、コード内に他のaccept()呼び出しはありません。 – adelbertc
データグラムソケットで 'accept()'を呼び出すことはできません。 'accept()'をまだ呼び出さなかった場合、なぜソケットを開くのにエラーが出ると思いますか? –