2

これは UDP ソケットに関する非常に基本的な質問です。私自身、それらを使用していくつかのサーバー/クライアントアプリケーションをプログラムしましたが、今は立ち往生しており、問題がどこにあるかを確認できません。

データグラムを送受信できるサーバーとクライアントを作成しようとしています。したがって、サーバーは決定されたソケットでクライアントからの請願を待ち、それを介して何かを受信すると、その応答をクライアントに送信します。サーバーが請願を取得して応答を返す限り機能しますが、クライアントはそれを取得しません。

ここでは、接続の基本的な部分だけを取り除いたコードをいくつか示します。

サーバ:

if ((socket_id = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
    return;
}

bzero(&server_socket, sizeof(server_socket));
server_socket.sin_family = AF_INET;
server_socket.sin_addr.s_addr = INADDR_ANY;
server_socket.sin_port = htons(8724);

if (bind(socket_id, (struct sockaddr *) &server_socket, sizeof(server_socket)) == -1) {
    return;
}

bzero(dgram_buffer, 1024);
client_socket_sz = sizeof(client_socket);
if((dgram_length = recvfrom(socket_id, dgram_buffer, 1024, 0, (struct sockaddr *) &client_socket, (socklen_t *) &client_socket_sz)) == -1) {

    return;
}
if (sendto(socket_id, msg_buffer, offset, 0, (struct sockaddr *) &client_socket, (socklen_t) client_socket_sz) < 0) {

    return;
}
printf("%s\n", msg_buffer);

クライアント:

if ((socket_id = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
        return;
}

if ((hostp = gethostbyname(hostname)) == 0) {
    return;
}
bzero((char *) &client_socket, sizeof(client_socket));
client_socket.sin_family = AF_INET;
client_socket.sin_port = htons(8724);
bcopy(hostp->h_addr, (char *) &client_socket.sin_addr, hostp->h_length);

bzero(msg_buffer,sizeof(msg_buffer));
memcpy(msg_buffer,"mensaje\0",sizeof("message"));

socklen_t client_socket_len = sizeof(struct sockaddr_in);
if (sendto(socket_id, msg_buffer, sizeof(msg_buffer), 0, (struct sockaddr *) &client_socket, client_socket_len) < 0) {
    return;
}
bzero(msg_buffer,sizeof(msg_buffer));
if(recvfrom(socket_id, msg_buffer, sizeof(msg_buffer), 0, (struct sockaddr *) &client_socket, &client_socket_len) == -1) {
    return;
}
printf("%s\n", msg_buffer);

(バッファとその内容があまり適切に処理されていないことはわかっています。実際のアプリケーションでは正しく処理しています。簡単なテストのために入力しただけです)

誰かがそれを見て、設定が間違っているかどうか教えてもらえますか? 私はネット上で何百もの例を見てきましたが、私の古いコードをレビューしました...役に立たなかった. たぶん、私はこれに何時間も取り組んできたので、明らかなことをスキップしているだけです。

前もって感謝します。

4

2 に答える 2

0

両方のソケットをバインドする必要があります。

すでにサーバーを既知のポートにバインドしています。
また、クライアントをポート 0 にバインドする必要があります。これは、OS がこのセッション用に任意のポートを選択することを意味します。ソケットがバインドされている間、そのポートにパケットが届きます。

于 2012-05-06T12:57:54.633 に答える
0

推測です。「while」ループでソケットから読み取ってみてください。そんな感じ:

int received = 0;
int tmp;
int expected = ...
while(received != expected){
    tmp = recvfrom(socket_id, msg_buffer, sizeof(msg_buffer), 0, (struct sockaddr *) &client_socket, &client_socket_len)
    if(tmp == -1){ ... }
    received += tmp;
}
于 2012-05-06T12:59:28.040 に答える