0

サーバーであると同時にクライアントであるCで書かれたアプリケーションがあります。私がしていることは次のとおりです。

sock = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&server, length);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(MYPORT);

char broadcast = '1';
int broadcastlen = sizeof(broadcast);
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, &broadcastlen) < 0) {
    close(sock);
    error("Error in setting broadcast option");
}
if (bind(sock, (struct sockaddr*) &server, sizeof(server)) < 0) {
    close(sock);
    error("Error in BINDING");
}
bzero(&sender, length);
bcast.sin_family = AF_INET;
bcast.sin_addr.s_addr = NBCAST; // NBCAST is the broadcast address of the subnet
bcast.sin_port = htons(MYPORT);

if (sendto(sock, dateQuery, strlen(dateQuery) + 1, 0, (struct sockaddr*)&bcast, sizeof(bcast)) < 0) {
    close(sock);
    error("ERROR in sending");
}

この時点まで、すべてがうまく機能しています。しかし、私はリッスンするsockパラメーターを使用してスレッドを開始し、次のことを行います。

int len = sizeof(struct sockaddr_in);
struct sockaddr_in sender_addr;

recfrom(sock, recvbuff, recvbufflen, 0, (struct sockaddr*) &sender_addr, &len);

そしてそれは永遠にそこをブロックします。別のPCから動作させようとしましたが、recvfrom()が原因でスレッドがブロックされているため、動作しないようです。誰かが私のコードの何が問題なのか教えてもらえますか?

ありがとう


編集:私のコードが壊れている場合、これを解決する方法を提案できますか?したがって、私のタスクは、サーバーとクライアントであるCで同時にアプリケーションを実装することです。3秒ごとにブロードキャストメッセージを送信し、そのブロードキャストメッセージにシステム時刻で応答する必要があります。これまでのところ、これは私が思いついたアイデアです。もちろん、私はそれを読むことさえできなかったので、そのブロードキャストメッセージに答えませんでした。

4

2 に答える 2

1

問題を解決しました。コードは完全に機能します。ファイアウォールを無効にする必要がありました。しかし、これがどのように私を助けたのか正確にはわかりません。とにかく、答えとコメントをありがとう。

于 2012-04-26T16:40:48.400 に答える
0

おそらく、ソケットをノンブロッキングにする必要がありますか?試す:

u_long iMode = 1;
ioctlsocket(sock, FIONBIO, &iMode);
于 2012-04-25T20:27:51.423 に答える