socket.h的recv()上的分段错误
我在执行的recv()函数时遇到了一个奇怪的分段错误。下面是我的代码中使用的recv()函数socket.h的recv()上的分段错误,c,sockets,udp,segmentation-fault,recv,C,Sockets,Udp,Segmentation Fault,Recv,我在执行的recv()函数时遇到了一个奇怪的分段错误。下面是我的代码中使用的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 = socke
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);
}
void*recv\u和更新(void*t)
{
int tid=(int)t;
int-sockfd;
地址中的结构sockaddr\u;
整数单位;
char-buf[BUFLEN];
int flag=1,len=sizeof(int);
如果((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){
printf(“未能在线程%d上创建套接字。\n”,tid);
出口(-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(“开始绑定。\n”);
if(绑定(sockfd,(结构sockaddr*)&addr,sizeof(addr)))
{
printf(“绑定线程%d上的套接字失败。\n”,tid);
出口(-1);
}
printf(“绑定完成。\n”);
而(1)
{
printf(“启动recv()\n”);
如果((numbytes=recv(sockfd,buf,BUFLEN,0))<0)
{
printf(“在线程%d上接收MSG失败。\n”,
工业贸易署(工贸署),;
出口(-1);
}
printf(“end recv(),numbytes=%d\n”,numbytes);
buf[numbytes]='\0';
pthread_mutex_lock(&mutex);
翻译和更新(buf);
pthread_mutex_unlock(&mutex);
}
关闭(sockfd);
pthread_exit(NULL);
}
这个问题最奇怪的部分是分割错误并不是每次都发生。通常在100次或200次接收后(或偶尔少于100次)。当它发生时,程序将只输出我的“start recv()”语句,而不输出“end recv()”
因此,我认为这个问题正好发生在recv()函数中,但我没有弄清楚为什么以及如何解决这个问题。SIGSEGV可能发生在其他地方,例如在
translate\u和\u update
中
为什么不启用内核转储(例如)并使用
gdb yourprog core
调试死后内核?SIGSEGV可能发生在其他地方,例如在翻译和更新中
为什么不启用内核转储(例如使用)并使用gdb yourprog core
调试验尸内核?根据您的描述,看起来recv()
正在阻塞,应用程序由于不同位置的错误而崩溃,这将在不同的线程中说
然而,buf
被声明为太小了一个字节
如果已读取BUFLEN
字节numbytes
将BUFLEN
,以下调用将写入未分配为buf
的内存:
buf[numbytes] = '\0';
要修复此更改
char buf[BUFLEN];
将来
根据您的描述,它看起来像是recv()
正在阻塞,并且应用程序由于不同位置的错误而崩溃,比如在不同的线程中
然而,buf
被声明为太小了一个字节
如果已读取BUFLEN
字节numbytes
将BUFLEN
,以下调用将写入未分配为buf
的内存:
buf[numbytes] = '\0';
要修复此更改
char buf[BUFLEN];
将来
当recv()
等待数据时,它也可能在另一个线程中崩溃。但这只是另一种猜测。如果您想知道是否在调试器下运行它。每次发生此故障时,它都会输出一个start recv()
,而不输出end recv()
。如果错误发生在另一个线程中,则不应该是这样。(哦,我忘了提到这个线程是我程序中唯一的接收线程。)它也可能在另一个线程中崩溃,而recv()
正在等待数据。但这只是另一种猜测。如果您想知道是否在调试器下运行它。每次发生此故障时,它都会输出一个start recv()
,而不输出end recv()
。如果错误发生在另一个线程中,则不应该是这样。(哦,我忘了提到这个线程是我程序中唯一的接收线程。)我试着编写recv(sockfd,buf,BUFLEN-1,0)
,它可能会产生与您的修改相同的效果。然而,这也不起作用。拉斯兰:那一定是另一个错误!您可能想向我们展示一下translate\u和\u update()
的功能。每次发生此错误时,输出是start recv()
,而不是end recv()
,如果我没有遗漏或误解某些内容,我认为错误完全发生在recv()函数部分。@lastland:Ok,从这个事实我可以得出结论,recv()。现在我正试着跟随这条线索,弄清楚到底发生了什么。谢谢。我已经试着编写了recv(sockfd,buf,BUFLEN-1,0)
,它可能会产生与您的修改相同的效果。然而,这也不起作用。拉斯兰:那一定是另一个错误!您可能想向我们展示一下translate\u和\u update()
的功能。每次发生此错误时,输出是start recv()
,而不是end recv()
,如果我没有遗漏或误解某些内容,我认为错误完全发生在recv()函数部分。@lastland:Ok,从这个事实我可以得出结论,recv()。现在我正试着跟随这条线索,弄清楚到底发生了什么。非常感谢。