一端口发送一端口接收socket编程

来源:互联网 发布:linux禁用用户怎么做 编辑:程序博客网 时间:2024/06/12 21:13
#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_IN11910#define PORT_OUT11911#define BACKLOG 3#define buflen  1024int quit=0;int inisok=0;int outisok=0;char rbuffer[buflen];char buffer[buflen];char wbuffer[buflen];pthread_mutex_t mutex;void* runnerIn(void *param);void* runnerOut(void *param);int main(int argc,char *argv[]){pthread_t tid1,tid2;pthread_attr_t attr;pthread_mutex_init(&mutex,NULL);pthread_attr_init(&attr);pthread_create(&tid1,&attr,runnerIn,argv[1]);    pthread_create(&tid2,&attr,runnerOut,argv[1]);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_mutex_destroy(&mutex);printf("quit!\n");}void* runnerIn(void *param){int ss,sc;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_IN);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");pthread_exit(0);}err = listen(ss,BACKLOG);   //设置监听的队列大小if(err < 0){printf("server : listen error\n");pthread_exit(0);}for(;;){socklen_t addrlen = sizeof(client_addr);sc = accept(ss,(struct sockaddr *)&client_addr,&addrlen);  //注,此处为了获取返回值使用 指针做参数if(sc < 0)  //出错{continue;   //结束此次循环}else{printf("IN:connected\n");inisok=1;while(!outisok);}for(;;){close(ss);int size;memset(rbuffer,0,buflen);for(size = 0;size == 0 ;size = read(sc,rbuffer,buflen));printf("%s\n",rbuffer);pthread_mutex_lock(&mutex);for(int i=0;i<buflen;i++){buffer[i]=rbuffer[i];}pthread_mutex_unlock(&mutex);if(strcmp(rbuffer,"quit") == 0)            {close(sc);quit=1;                pthread_exit(0);            }}}}void* runnerOut(void *param){int ss,sc;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_OUT);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");pthread_exit(0);}err = listen(ss,BACKLOG);   //设置监听的队列大小if(err < 0){printf("server : listen error\n");pthread_exit(0);}for(;;){socklen_t addrlen = sizeof(client_addr);sc = accept(ss,(struct sockaddr *)&client_addr,&addrlen);  //注,此处为了获取返回值使用 指针做参数if(sc < 0)  //出错{continue;   //结束此次循环}else{printf("OUT:connected\n");outisok=1;while(!inisok);}for(;;){close(ss);int size;memset(wbuffer,0,buflen);sleep(1);pthread_mutex_lock(&mutex);write(sc,buffer,strlen(buffer)+1);pthread_mutex_unlock(&mutex);if(strcmp(rbuffer,"quit") == 0)            {close(sc);quit=1;                pthread_exit(0);            }}}}

阅读全文
0 0
原创粉丝点击