关于多线程socket通信 导致的异常

xiaoseyihe 2018-08-16 10:34:13
功能描述:进程中每次创建一个客户端线程,客户端与服务器建立一个连接,如果有新的客户端线程创建,就要把之前建立的socket 连接断开并退出线程。问题是 客户端在关闭socket时,会引起主进程退出,查询相关资料说是由于SIGPIPE导致进程退出,请高手给与指导,谢谢

客户端代码:
void * TL_SynOnlineThreadProcess(void *args)
{
struAudioProcess *pstAudioObj = (struAudioProcess *)args;
int sockfd;
int len;
int RevData;
struct sockaddr_un address;
int result;
char buff[100];


/* Create a socket for the client. */

sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

/* Name the socket, as agreed with the server. */

address.sun_family = AF_UNIX;
strcpy(address.sun_path, UNIX_SOCKET_FILE);
len = sizeof(address);

/* Now connect our socket to the server's socket. */

result = connect(sockfd, (struct sockaddr *)&address, len);

if(result == -1) {
//printf("unix connect fail %s %d \n",__FILE__,__LINE__);
sprintf(buff, "connect failure pid %d, tid %d.",getpid(),gettid());
TL_GetMsgLog(buff, 1111);
close(sockfd);
return NULL;
}


sprintf(buff, "TL_SynOnlineThread pid %d, tid %d.",getpid(),gettid());
TL_GetMsgLog(buff, 9999);

pthread_mutex_lock(&process_mutex);
g_Ttid = gettid();
pthread_mutex_unlock(&process_mutex);


while(1)
{

if(g_Ttid !=gettid())
{


close(sockfd);

pthread_exit(0);


}
else
{

recv(sockfd, &RevData, sizeof(int), 0);
if(RevData == 1)
{
pstAudioObj->iPrmSet = 1;
//printf("TLTL tid_%d pid_%d line_%d %s \n",gettid(),getpid(),__LINE__,__FUNCTION__);
}
if(RevData >= 100)
{
pstAudioObj->iPrmSet = 2;
g_Vol = RevData - 100;
}
}


}


//return NULL;
}


服务器端线程:
void * TL_MsgProcess(void * arg)
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
int ret;

pthread_mutex_init(&update_mutex, NULL);


/* Remove any old socket and create an unnamed socket for the server. */

unlink(UNIX_SOCKET_FILE);
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

/* Name the socket. */

server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, UNIX_SOCKET_FILE);
server_len = sizeof(server_address);
ret = bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
if(ret == -1)
{
close(server_sockfd);
unlink(UNIX_SOCKET_FILE);

return NULL;
}

/* Create a connection queue and wait for clients. */

ret = listen(server_sockfd, MAX_LISTEN_NUM_UNIX_SOCKET);
if(ret == -1)
{

close(server_sockfd);
unlink(UNIX_SOCKET_FILE);
}


while(1)
{

//printf("server waiting\n");

/* Accept a connection. */

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
if(client_sockfd<0)
{

continue;
}

//printf("accecpt a connection : %d \r\n", client_sockfd);

/*creat a thread*/
pthread_t id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);


pthread_create(&id,&attr,(void *)TL_MsgClientThreadProcess,(void*)(&client_sockfd));


}
//close(client_sockfd);
//close(server_sockfd);


void * TL_MsgClientThreadProcess(void * pfd)
{
int client_sockfd;
int data;
int send_flag;
int send_fifo_flag;
char buff[100];
int heatbeat = 0xa5a5a5a5;

client_sockfd = *((int*)pfd);
send_flag = 0;
send_fifo_flag = 0;

pthread_mutex_lock(&update_mutex);
g_Ttid = gettid();
pthread_mutex_unlock(&update_mutex);

while(1)
{

if (!semaphore_p())
{
g_err_msg_code = errno;
printf("TLTL line_%d %s %d %s\n",__LINE__,__FUNCTION__,errno,strerror(errno));
//goto _end_msg_client;
}

if(g_PCSendToDev_OK == 1)
{
if(send_flag == 0)
{
data = 1;
//write(client_sockfd,&data,sizeof(data));
send(client_sockfd,&data,sizeof(data),0);
send_flag = 1;
}
}
else
{
send_flag = 0;
//write(client_sockfd,&heatbeat,sizeof(heatbeat));
//sleep(10);
}



if(g_FIFO_OK == 1)
{
if(send_fifo_flag == 0)
{

data = g_read_val + 100; //make sure data >= 100
//write(client_sockfd,&data,sizeof(data));
send(client_sockfd,&data,sizeof(data),0);
send_fifo_flag = 1;
}
}
else
{
send_fifo_flag = 0;
}


if (!semaphore_v())
{
g_err_msg_code = errno;
printf("TLTL line_%d %s %d %s\n",__LINE__,__FUNCTION__,errno,strerror(errno));
//goto _end_msg_client;
}

usleep(15000);

if(g_Ttid !=gettid())
{
close(client_sockfd);

pthread_exit(0);

}
}
}
...全文
295 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoseyihe 2018-08-21
  • 打赏
  • 举报
回复
没有看到吗?自己顶下

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧