サーバーであると同時にクライアントである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秒ごとにブロードキャストメッセージを送信し、そのブロードキャストメッセージにシステム時刻で応答する必要があります。これまでのところ、これは私が思いついたアイデアです。もちろん、私はそれを読むことさえできなかったので、そのブロードキャストメッセージに答えませんでした。