4

わかりましたので、UDP コードを機能させようとしていますが、C を使用したネットワーク プログラミングに関してはほとんど緑色ではありません。ここのサンプル ファイルを使用しています。

基本的に、特定のポートで着信 UDP パケットをリッスンしているだけで、同じ方法でデータを送り返したいと考えています。以下、該当部分です。

この時点で、ソケットがセットアップされ、選択したポートにバインドされ、着信パケットを待ちます。

printf("GSProxy: waiting to recvfrom...\n");

addr_len = (socklen_t) sizeof their_addr;
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
    (struct sockaddr *)&their_addr, &addr_len)) == -1) { // argument 6 gives a warning but is correct int
    perror("recvfrom");
    exit(1);
}

printf("GSProxy: got packet from %s\n", 
inet_ntop(their_addr.ss_family, 
    get_in_addr((struct sockaddr *)&their_addr), s, sizeof s));
printf("GSProxy: packet is %d bytes long\n", numbytes);
buf[numbytes] = '\0';
printf("GSProxy: packet contains \"%s\"\n", buf);

char retmsg[] = "Hello!";
if ((numbytes = sendto(sockfd, retmsg, 7, 0, 
    (struct sockaddr *) &their_addr, &addr_len)) == -1) {
    perror("GSPProxy: sendto");
    exit(1);
}

printf("GSProxy: Sent %i bytes.\n", numbytes);

「こんにちは!」を送りたいだけです。送信者に文字列を返します。

これはエラー " GSPProxy: sendto: File name too long" で失敗します。私が知る限り、[ENAMETOOLONG] エラー コードはどれですか。

しかし... **はどういう意味ですか? 何のファイル?長すぎるとは?

ソケットを再利用してデータを送り返すことができないということですか、それともまた新しい間違いを犯したのでしょうか?

よろしくお願いします、

4

2 に答える 2

14

ソケット構造体の長さのアドレスを に渡すべきではありません。sendto()実際の長さが必要です (つまり、"addr_len"ではありません"&addr_len")。

長さのアドレスを渡す理由recvfrom()は、実際のアドレスがたまたま短い場合、その関数によって変更されるためです。

つまり、次のように置き換えます。

if ((numbytes = sendto (sockfd, retmsg, 7, 0,
    (struct sockaddr *) &their_addr, &addr_len)) == -1) {

と:

if ((numbytes = sendto (sockfd, retmsg, 7, 0,
    (struct sockaddr *) &their_addr, addr_len)) == -1) {
于 2009-01-20T23:17:58.797 に答える
1

ええと、少なくとも、sendto に渡した '&addr_len' は、おそらくアドレスで渡されるべきではありませんでした: つまり、addr_len だけだったはずです。

于 2009-01-20T23:18:39.500 に答える