当前位置: 技术问答>linux和unix
linux c socket多线程编程
来源: 互联网 发布时间:2017-01-20
本文导语: 我现在写一个服务端程序,要求可以链接多个客户端 有报警信息时要能发送报警信息,如果客户端有数据发来时,接收客户端的信息 现在运行起来有问题,当我打开第一个客户端时运行正常,当我断开这个链接,再...
我现在写一个服务端程序,要求可以链接多个客户端
有报警信息时要能发送报警信息,如果客户端有数据发来时,接收客户端的信息
现在运行起来有问题,当我打开第一个客户端时运行正常,当我断开这个链接,再重新打开一个客户端时,发送时就出现了问题,情况如下:
第一个链接
There is a new socket link coming 4!
alarmtype = 50
data from socket 4, bytes = 1212
data from socket 4, bytes = 1212
Socket link 4 disconnect!
第二个链接
There is a new socket link coming 5!
alarmtype = 50
send error
: Bad file descriptor
data from socket 5, bytes = 1212
data from socket 5, bytes = 1212
代码如下:
void *sockalarm(void *arg)
{
int sdbytes = 0;
int cnfd = (int)arg;
int connfd;
rtcp_hdr_t rtcp_head;
warn_hdr_t pkt;
struct sockaddr_in cliaddr;
socklen_t cliaddr_len;
pthread_t rcvthread[pthread_count];
pthread_t sendthread[pthread_count];
struct sockaddr_in servaddr, cliaddr;
int sockfd;
pthread_t sockthread;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(sockfd, MAX_NUM);
printf("Accepting connections ...n");
cliaddr_len = sizeof(cliaddr);
while(1)
{
if(pthread_count
有报警信息时要能发送报警信息,如果客户端有数据发来时,接收客户端的信息
现在运行起来有问题,当我打开第一个客户端时运行正常,当我断开这个链接,再重新打开一个客户端时,发送时就出现了问题,情况如下:
第一个链接
There is a new socket link coming 4!
alarmtype = 50
data from socket 4, bytes = 1212
data from socket 4, bytes = 1212
Socket link 4 disconnect!
第二个链接
There is a new socket link coming 5!
alarmtype = 50
send error
: Bad file descriptor
data from socket 5, bytes = 1212
data from socket 5, bytes = 1212
代码如下:
void *sockalarm(void *arg)
{
int sdbytes = 0;
int cnfd = (int)arg;
int connfd;
rtcp_hdr_t rtcp_head;
warn_hdr_t pkt;
struct sockaddr_in cliaddr;
socklen_t cliaddr_len;
pthread_t rcvthread[pthread_count];
pthread_t sendthread[pthread_count];
struct sockaddr_in servaddr, cliaddr;
int sockfd;
pthread_t sockthread;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(sockfd, MAX_NUM);
printf("Accepting connections ...n");
cliaddr_len = sizeof(cliaddr);
while(1)
{
if(pthread_count