在多线程服务器中使用套接字
我正在* nix下开发c上的多线程服务器。在进程的主线程中,我有监听套接字,它等待连接(接受)。当它获得一个连接(接受返回客户端套接字描述符)时,我会启动新的pthread,并创建一些例程,该例程将响应请求并关闭客户端套接字描述符。它看起来像这样:
while(1)
{
sock_cl =(int *)malloc(sizeof(int));
*sock_cl = accept(sock_serv, NULL, NULL);
pthread_create(thread, attr, answer, sock_cl);
}
接听功能:
void *answer(void *arg)
{
int sock_cl;
char *buf;
ssize_t r;
lsres_t *ans;
char *path;
char status[STATUS_SIZE];
sock_cl = *((int *)arg);
if((buf = (char *)malloc(BUF_SIZE + 1)) == NULL)
{
sprintf(status, "%i\n", -1);
send_data(sock_cl, status, STATUS_SIZE);
close(sock_cl);
free(arg);
return NULL;
}
memset(buf, '\0', BUF_SIZE + 1);
if((r = recv(sock_cl, buf, BUF_SIZE, 0)) <= 0)
{
close(sock_cl);
free(arg);
return NULL;
}
path = strtok(buf, "\r\0");
if((ans = lscreate()) == NULL)
{
sprintf(status, "%i\n", -1);
send_data(sock_cl, status, STATUS_SIZE);
}
else
{
if(myls(path, ans) != 0)
{
sprintf(status, "%i\n", -1);
send_data(sock_cl, status, STATUS_SIZE);
}
else
{
sprintf(status, "%i\n", ans->status);
send_data(sock_cl, status, STATUS_SIZE);
send_data(sock_cl, ans->buf, ans->written_size);
}
lsdestroy(ans);
}
close(sock_cl);
free(arg);
return NULL;
}
在接听功能我们可以调用recv从客户recive数据和发送一些答案。它在Linux系统(Arch,Debian,Ubuntu)下运行良好,但是当我尝试在Unix(Solaris)下运行它时,我得到了segv掉落recv函数。问题不在缓冲区中,因为如果我尝试在与答复函数相同的线程中调用answer函数,我没有分段下降。所以在使用带有pthreads的套接字时存在一些问题。
请告诉我任何解决方案如何在多线程服务器中使用套接字。感谢您的未来答案!
我觉得在UNIX recv函数失败,分割faut是由于代码段free(args);
可能,这可能是
close(sock_cl);
free(arg);
return NULL;
这sock_cl是线程间共享的原因,因为有没有同步的答案功能,因为你释放这个指针的其他线程绑定崩溃,如果可能的话,你通过在valgrind中运行检查这个相同的程序腐败。
我认为这不是一个原因,因为每个线程都有自己的指向sock_cl的指针(它在每次迭代中都是malloc)。线程有不同的指针。 – tegoo 2013-05-12 15:01:13
oops刚刚实现 – 2013-05-12 15:13:18
在Solaris上,通常需要使用-mt
进行编译才能正确编译和链接多线程程序。如果你不使用它,你会看到随机的线程崩溃。
此密钥适用于cc。我正在使用以下密钥的gcc: -lpthread -D_REENTRANT -lrt -lsocket -lnsl – tegoo 2013-05-13 11:39:28
即使没有*分段故障发生也没有。 – tegoo 2013-05-12 15:30:58
请检查sock_cl在回答中有效() – akhil 2013-05-12 15:35:07
也我认为sock_cl =(int)(* arg);是足够的,而不是sock_cl = *((int *)arg); – akhil 2013-05-12 15:37:19