关于多线程socket通信 导致的异常
功能描述:进程中每次创建一个客户端线程,客户端与服务器建立一个连接,如果有新的客户端线程创建,就要把之前建立的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);
}
}
}