我的网络程序存在分段故障问题,使用线程来处理每个新连接。
MAX_PEERS在上面定义为10.
...
int iret[MAX_PEERS];
pthread_t thread[MAX_PEERS];
(void) signal(SIGCHLD, reaper);
printf("before while\n");
int i = 0;
while(1) {
if(i>MAX_PEERS-1){break;}
client_len = sizeof(client);
new_sd = accept(sd, (struct sockaddr *)&client, &client_len);
if(new_sd < 0){
fprintf(stderr, "Can't accept client \n");
exit(1);
}
printf("before thread\n");
iret[i] = pthread_create(&thread[i], NULL, connection, (void*) new_sd);
if(iret != 0){
printf("thread[%d] not generated!\n", i);
}
i++;
printf("end of while\n");
}
....
和功能&#34;连接&#34; beggins如下
void *connection(void *sdd)
{
int sd =* (int *) sdd;
...
当客户端尝试连接到服务器时,我遇到了分段错误。
> ./server 20011
before while
before accept
after accept
before thread
./server: zsh: segmentation fault ./server 20011
>
在接受之前打印&#34;&#34;在客户端连接之前,在客户端连接之后打印其余部分。
我是否正确创建了线程?有什么想法吗?
谢谢,
答案 0 :(得分:0)
accept()返回一个整数,因此new_sd
必须是整数。创建新线程时,将new_sd
强制转换为void指针。但是当你在函数中获得该指针时,不是将其转换为int而是将其转换为指向int的指针并取消引用它,这会导致seg错误。
而不是使用可能不正确的强制转换,而是传递一个整数。假设new_sd
超出范围,为整数分配空间并将其传递给您的线程。
int* new_sdp = malloc( sizeof( *new_sdp )) ;
*new_sdp = new_sd ;
iret[i] = pthread_create(&thread[i], NULL, connection, new_sdp);
并在帖子中:
void *connection(void *sdd)
{
int sd = *(int *)sdd;