0

プログラム (クライアント) が C のソケットを使用して別の (サーバー) と通信しようとしていますが、サーバーから常に "Invalid Argument" エラーが発生します。

何が起こっているのかを説明した後、この問題に関連するコードを示します。

クライアントに関しては、すべてが正しく機能していると思います。クライアントはサーバーにリクエストを送信し、サーバーはメッセージを正しく受信しますが、サーバーが応答しようとすると「無効な引数」エラーが発生します。

これは、サーバーのメイン関数で使用される変数の宣言です。

int port = DEFAULT_PORT;
int sock;
struct sockaddr_in hostAdress, clientAdress;
socklen_t clientAdressLength;

ここでは、ソケットを hostAdress にバインドします。

sock = socket(PF_INET,SOCK_DGRAM,0);
memset(&hostAdress, 0, sizeof(struct sockaddr_in));
memset(&clientAdress, 0, sizeof(struct sockaddr_in));
hostAdress.sin_family = AF_INET;
hostAdress.sin_port = htons(port);
hostAdress.sin_addr.s_addr = INADDR_ANY;
bind(sock, (struct sockaddr*) &hostAdress, sizeof(hostAdress));

少しコードを記述した後、recvfrom を次のように使用して、情報を受信するループに入ります。

recvfrom(sock, dataBuffer, sizeof(dataBuffer), 0, (struct sockaddr*)&clientAdress, &clientAdressLength);

サーバーがリクエストを受信すると、それを識別し、この関数にジャンプします (この動作は確認されています)。

handle_helloRQ(sock, clientAdress, clientAdressLength);

sizeof(clientAdress) を実行して「clientAdressLength」を取得できることは承知していますが、これを行うと、前回同じ問題が修正されました。この関数は次のように宣言されます。

int handle_helloRQ(int sock, struct sockaddr_in server_addr, socklen_t server_addr_length)

この関数では、主な変数は次のとおりです。

char buffer[512];
size_t bufferSize = sizeof(buffer);
memset(&buffer, 0, sizeof(buffer));
stshort(2, buffer);
strcat(buffer+2, "Hello World");

stshort は、バッファーの最初の 2 バイトに short int を配置する単純なマクロです。これは意図したとおりに機能します。

それが完了すると、次のことを試みます。

sendto(sock, buffer, bufferSize, 0, (struct sockaddr*)&server_addr, server_addr_length);

...そして、これは物事がうまくいかないときです。sendto が を返し-1、使用perror("sendto");すると " Invalid Argument" エラーが発生します。パラメータを代入するための千の異なる方法を試しましたが、エラーを見つけることができません。この種の問題に関しては、他の選択肢を使い果たしました (つまり、大学の教師に尋ねて、より上級の同僚にコードを見せます)、誰もエラーを見つけることができなかったようです。補足として、私は使用します

close(sock);

サーバーが閉じる信号を受信したときですが、この機能に到達する前に一度強制的に閉じる必要があったかもしれません。

これを読んでいる人は誰でも、お時間をいただきありがとうございます!

4

1 に答える 1

3

代わりにこれを試してください:

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); // <-- add protocol
...    
clientAdressLength = sizeof(clientAdress); // <-- add this
recvfrom(sock, dataBuffer, sizeof(dataBuffer), 0, (struct sockaddr*)&clientAdress, &clientAdressLength);
...
handle_helloRQ(sock, (struct sockaddr*)&clientAdress, clientAdressLength); // <-- pass address by pointer
...
close(sock);

int handle_helloRQ(int sock, struct sockaddr* recip_addr, socklen_t recip_addr_length)
{
    char buffer[512];
    memset(&buffer, 0, sizeof(buffer));
    stshort(2, buffer);
    strcat(buffer+2, "Hello World");

    sendto(sock, buffer, sizeof(buffer), 0, recip_addr, recip_addr_length);
    ...
}
于 2014-03-15T01:12:07.323 に答える