两端口通信TCP服务器(Linux)

来源:互联网 发布:阳江市问政网络平台 编辑:程序博客网 时间:2024/06/15 20:27
//xyt@zhejiang-2017/5#include <stdio.h>#include <stdlib.h>#include <strings.h>#include <sys/types.h>#include <sys/socket.h>#include <memory.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#include <signal.h>#include <pthread.h>#define PORT_111910#define PORT_2  11911#define buflen  1024    //接收缓冲区(KB)#define TIMEOUT     20      //超时自动断开时间(s)#define BACKLOG 1int quit=0;int ok_1=0;int ok_2=0;int client_1,client_2;char rbuffer_1[buflen];char rbuffer_2[buflen];int times=0;char retInfo[10]="quit!\n";pthread_mutex_t mutex;void* runnerSpeaker1(void *param);void* runnerSpeaker2(void *param);void* runnerTimer(void *param);int main(int argc,char *argv[]){pthread_t tid1,tid2,tid3;pthread_attr_t attr;pthread_mutex_init(&mutex,NULL);pthread_attr_init(&attr);pthread_create(&tid1,&attr,runnerSpeaker1,argv[1]);    pthread_create(&tid2,&attr,runnerSpeaker2,argv[1]);    pthread_create(&tid3,&attr,runnerTimer,argv[1]);pthread_detach(tid1);    pthread_detach(tid2);    pthread_detach(tid3);    while(!quit)    {    }    close(client_1);    close(client_2);pthread_mutex_destroy(&mutex);    printf("%s",retInfo);    return 0;}void* runnerSpeaker1(void *param){int ss;int err;struct sockaddr_in server_addr; //存储服务器端socket地址结构struct sockaddr_in client_addr; //存储客户端 socket地址结构ss = socket(AF_INET,SOCK_STREAM,0); //建立一个序列化的,可靠的,双向连接的的字节流memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;           //协议族server_addr.sin_addr.s_addr = htonl(INADDR_ANY);   //本地地址server_addr.sin_port = htons(PORT_1);int opt=1;setsockopt(ss,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(&opt));//自动释放端口err = bind(ss,(struct sockaddr *)&server_addr,sizeof(sockaddr));if(err<0){printf("server : bind error\n");quit=1;pthread_exit(0);}err = listen(ss,BACKLOG);   //设置监听的队列大小if(err < 0){printf("server : listen error\n");quit=1;pthread_exit(0);}for(;;){socklen_t addrlen = sizeof(client_addr);client_1 = accept(ss,(struct sockaddr *)&client_addr,&addrlen);  //注,此处为了获取返回值使用 指针做参数if(client_1 < 0)  //出错{quit=1;   //结束此次循环}else{printf("1:connected\n");ok_1=1;while(!ok_2);}for(;;){close(ss);            int size;memset(rbuffer_1,0,buflen);            for(size = 0;size == 0 ;size = read(client_1,rbuffer_1,buflen));            pthread_mutex_lock(&mutex);            times=0;            pthread_mutex_unlock(&mutex);            printf("1:%d Byte\n",size);write(client_2,rbuffer_1,strlen(rbuffer_1)+1);            if(strcmp(rbuffer_1,"quit") == 0)            {                quit=1;            }}}}void* runnerSpeaker2(void *param){int ss;int err;struct sockaddr_in server_addr; //存储服务器端socket地址结构struct sockaddr_in client_addr; //存储客户端 socket地址结构ss = socket(AF_INET,SOCK_STREAM,0); //建立一个序列化的,可靠的,双向连接的的字节流memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;           //协议族server_addr.sin_addr.s_addr = htonl(INADDR_ANY);   //本地地址server_addr.sin_port = htons(PORT_2);int opt=1;setsockopt(ss,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(&opt));//自动释放端口err = bind(ss,(struct sockaddr *)&server_addr,sizeof(sockaddr));if(err<0){printf("server : bind error\n");quit=1;pthread_exit(0);}err = listen(ss,BACKLOG);   //设置监听的队列大小if(err < 0){printf("server : listen error\n");quit=1;pthread_exit(0);}for(;;){socklen_t addrlen = sizeof(client_addr);client_2 = accept(ss,(struct sockaddr *)&client_addr,&addrlen);  //注,此处为了获取返回值使用 指针做参数if(client_2 < 0)  //出错{quit=1;   //结束此次循环}else{printf("2:connected\n");ok_2=1;while(!ok_1);}for(;;){close(ss);            int size;memset(rbuffer_2,0,buflen);            for(size = 0;size == 0 ;size = read(client_2,rbuffer_2,buflen));            pthread_mutex_lock(&mutex);            times=0;            pthread_mutex_unlock(&mutex);            printf("2:%d Byte\n",size);write(client_1,rbuffer_2,strlen(rbuffer_2)+1);            if(strcmp(rbuffer_2,"quit") == 0)            {quit=1;            }}}}void* runnerTimer(void *param){    while(1)    {        if(ok_1&&ok_2)        {            pthread_mutex_lock(&mutex);            times++;            pthread_mutex_unlock(&mutex);            if(times>TIMEOUT)            {                sprintf(retInfo,"timeout!\n");                quit=1;            }        }        sleep(1);    }}

原创粉丝点击