のrecv()関数を実行すると、奇妙なセグメンテーション違反が発生しました。ここで私のコードでrecv()を使った関数があります。socket.hのrecv()でセグメンテーションエラーが発生しました
void* recv_and_update(void* t) {
int tid = (int) t;
int sockfd;
struct sockaddr_in addr;
int numbytes;
char buf[BUFLEN];
int flag = 1, len = sizeof(int);
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
printf("Failed to create socket on thread %d.\n", tid);
exit(-1);
}
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(node.port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, len);
printf("start binding.\n");
if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr))) {
printf("Failed to bind socket on thread %d.\n", tid);
exit(-1);
}
printf("binding finished.\n");
while (1) {
printf("start recv()\n");
if ((numbytes = recv(sockfd, buf, BUFLEN, 0)) < 0) {
printf("Failed to receive msgs on thread %d.\n",
tid);
exit(-1);
}
printf("end recv(), numbytes=%d\n", numbytes);
buf[numbytes] = '\0';
pthread_mutex_lock(&mutex);
translate_and_update(buf);
pthread_mutex_unlock(&mutex);
}
close(sockfd);
pthread_exit(NULL);
}
この問題の最も奇妙な部分は、毎回セグメンテーションフォールトが発生しないということです。通常、受信の100回または200回後(または時々より少ない回数)。そして、それが起こると、プログラムは "recv()"を終了しないで "start recv()"文のみを出力します。
私はrecv()関数で問題が発生したと思いますが、これを修正する理由と方法を理解できませんでした。
'recv()'がデータを待っている間に別のスレッドでクラッシュすることもあります。しかし、これは単なる推測です。あなたがデバッガの下でそれを正確に実行することを知りたければ。 –
このエラーが発生するたびに、 'recv()'を出力せずに 'start recv()'を出力します。別のスレッドでエラーが発生した場合、このようにすべきではありません。 (ああ、このスレッドは自分のプログラム内で唯一のスレッドを受け取っていることを忘れていました) – lastland