Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
socket.h的recv()上的分段错误_C_Sockets_Udp_Segmentation Fault_Recv - Fatal编程技术网

socket.h的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

我在执行的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 = 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()。现在我正试着跟随这条线索,弄清楚到底发生了什么。非常感谢。