├── afunix_serv_clnt ├── afunix_clnt.c └── afunix_serv.c ├── broadcast_serv_clnt ├── receiver.c └── sender.c ├── edge_trigger_epoll_serv_clnt ├── echo_clnt2.c └── edge_trigger_epoll_serv.c ├── ftp_serv_clnt ├── ftpclnt.c └── ftpserv.c ├── level_triger_epoll_serv_clnt ├── echo_clnt2.c └── epoll_serv.c ├── multicast_serv_clnt ├── reciver.c └── sender.c ├── multiprocess_save_message_serv_clnt ├── multi_pro_clnt .c └── pipe_server.c ├── multiprocess_serv_clnt ├── multi_pro_clnt.c └── multi_pro_server.c ├── multithread_serv_clnt ├── chat_clnt.c ├── chat_server.c └── chat_server2.c ├── poll_serv_clnt ├── echo_clnt2.c └── poll_serv.c ├── select_serv_clnt ├── echo_clnt2.c └── select_serv.c ├── semaphore_multithread_serv_clnt ├── echo_clnt2.c └── sem_mul_serv.c └── singleProcess_serv_clnt ├── echo_clnt.c └── echo_serv.c /afunix_serv_clnt/afunix_clnt.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #define BUF_SIZE 1024 7 | 8 | int main() 9 | { 10 | int sock; 11 | struct sockaddr_un addr; 12 | int str_len; 13 | char buf[BUF_SIZE]; 14 | char* path="sock"; 15 | sock=socket(AF_UNIX,SOCK_STREAM,0); 16 | 17 | addr.sun_family=AF_UNIX; 18 | strncpy(addr.sun_path,path,strlen(path)); 19 | 20 | connect(sock,(struct sockadd*)&addr,sizeof(addr)); 21 | 22 | while(1) 23 | { 24 | fputs("input:",stdout); 25 | fgets(buf,BUF_SIZE,stdin); 26 | if(!strcmp(buf,"q\n")||!strcmp(buf,"Q\n")) 27 | break; 28 | write(sock,buf,BUF_SIZE); 29 | str_len=read(sock,buf,BUF_SIZE-1); 30 | buf[str_len]=0; 31 | printf("the message from serv:%s\n",buf); 32 | 33 | } 34 | close(sock); 35 | return 0; 36 | } 37 | -------------------------------------------------------------------------------- /afunix_serv_clnt/afunix_serv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(const char* message); 11 | int main() 12 | { 13 | int serv_sock,clnt_sock; 14 | struct sockaddr_un serv_addr,clnt_addr; 15 | int clnt_addr_sz,str_len; 16 | char buf[BUF_SIZE]; 17 | char * path="sock"; 18 | 19 | serv_sock=socket(AF_UNIX,SOCK_STREAM,0); 20 | 21 | 22 | serv_addr.sun_family=AF_UNIX; 23 | strncpy(serv_addr.sun_path,path,strlen(path)); 24 | 25 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 26 | error_handling("bind() error"); 27 | 28 | if(listen(serv_sock,1)==-1) 29 | error_handling("listen() error"); 30 | 31 | clnt_addr_sz=sizeof(clnt_addr); 32 | if((clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz))==-1) 33 | error_handling("accept() error"); 34 | 35 | while(1) 36 | { 37 | str_len = read(clnt_sock,buf,BUF_SIZE); 38 | if(str_len<=0) 39 | break; 40 | write(clnt_sock,buf,str_len); 41 | } 42 | 43 | close(clnt_sock); 44 | close(serv_sock); 45 | return 0; 46 | } 47 | void error_handling(const char* message) 48 | { 49 | fputs(message,stderr); 50 | fputc('\n',stderr); 51 | exit(1); 52 | } 53 | -------------------------------------------------------------------------------- /broadcast_serv_clnt/receiver.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #define BUF_SIZE 30 7 | 8 | void error_handling(const char* message); 9 | 10 | int main(int argc,char* argv[]) 11 | { 12 | int sock; 13 | struct sockaddr_in addr; 14 | char message[BUF_SIZE]; 15 | int str_len=0; 16 | 17 | sock=socket(AF_INET,SOCK_DGRAM,0); 18 | if(sock==-1) 19 | error_handling("socket() error"); 20 | 21 | memset(&addr,0,sizeof(addr)); 22 | addr.sin_family=AF_INET; 23 | addr.sin_addr.s_addr=htonl(INADDR_ANY); 24 | addr.sin_port=htons(atoi(argv[1])); 25 | 26 | if(bind(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 27 | error_handling("bind() error"); 28 | 29 | while(1) 30 | { 31 | str_len=recvfrom(sock,message,BUF_SIZE-1,0,NULL,NULL); 32 | if(str_len<=0) 33 | break; 34 | message[str_len]=0; 35 | fputs(message,stdout); 36 | } 37 | close(sock); 38 | return 0; 39 | } 40 | 41 | void error_handling(const char* message) 42 | { 43 | fputs(message,stderr); 44 | fputc('\n',stderr); 45 | exit(1); 46 | } 47 | -------------------------------------------------------------------------------- /broadcast_serv_clnt/sender.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #define BUF_SIZE 30 7 | 8 | void error_handling(const char* message); 9 | 10 | int main(int argc,char* argv[]) 11 | { 12 | int sock; 13 | struct sockaddr_in addr; 14 | char message[BUF_SIZE]; 15 | int so_brd=1; 16 | 17 | sock=socket(AF_INET,SOCK_DGRAM,0); 18 | if(sock==-1) 19 | error_handling("socket() error"); 20 | 21 | memset(&addr,0,sizeof(addr)); 22 | addr.sin_family=AF_INET; 23 | addr.sin_addr.s_addr=inet_addr(argv[1]); 24 | addr.sin_port=htons(atoi(argv[2])); 25 | 26 | 27 | setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(void*)&so_brd,sizeof(so_brd)); 28 | 29 | while(1) 30 | { 31 | printf("input:"); 32 | fgets(message,BUF_SIZE,stdin); 33 | if(!strcmp(message,"q\n")||!strcmp(message,"Q\n")) 34 | break; 35 | sendto(sock,message,BUF_SIZE,0,(struct sockaddr*)&addr,sizeof(addr)); 36 | } 37 | close(sock); 38 | return 0; 39 | } 40 | 41 | void error_handling(const char* message) 42 | { 43 | fputs(message,stderr); 44 | fputc('\n',stderr); 45 | exit(1); 46 | } 47 | -------------------------------------------------------------------------------- /edge_trigger_epoll_serv_clnt/echo_clnt2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | void read_handling(int sock); 12 | void write_handling(int sock); 13 | 14 | int main(int argc,char* argv[]) 15 | { 16 | int sock; 17 | struct sockaddr_in addr; 18 | pid_t pid; 19 | 20 | if(argc!=3) 21 | { 22 | printf("Usage %s
\n",argv[0]); 23 | exit(1); 24 | } 25 | 26 | sock=socket(AF_INET,SOCK_STREAM,0); 27 | if(sock==-1) 28 | error_handling("socket() error"); 29 | 30 | memset(&addr,0,sizeof(addr)); 31 | addr.sin_family=AF_INET; 32 | addr.sin_addr.s_addr=inet_addr(argv[1]); 33 | addr.sin_port=htons(atoi(argv[2])); 34 | 35 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 36 | error_handling("connect() error"); 37 | 38 | pid=fork(); 39 | if(pid==0) 40 | { 41 | write_handling(sock); 42 | } 43 | else 44 | { 45 | read_handling(sock); 46 | } 47 | close(sock); 48 | return 0; 49 | } 50 | 51 | //写进程 52 | void write_handling(int sock) 53 | { 54 | char buf[BUF_SIZE]; 55 | while(1) 56 | { 57 | memset(buf,0,BUF_SIZE); 58 | //fputs("Input:",stdout); 59 | fgets(buf,BUF_SIZE,stdin); 60 | if(!strcmp(buf,"q\n")|| 61 | !strcmp(buf,"Q\n")) 62 | { 63 | shutdown(sock,SHUT_WR); 64 | return; 65 | } 66 | write(sock,buf,strlen(buf)); 67 | } 68 | } 69 | 70 | //读进程 71 | void read_handling(int sock) 72 | { 73 | int str_len; 74 | char buf[BUF_SIZE]; 75 | while(1) 76 | { 77 | str_len=read(sock,buf,BUF_SIZE-1); 78 | if(str_len<=0) 79 | return; 80 | buf[str_len]=0; 81 | printf("the message from server:%s\n",buf); 82 | } 83 | } 84 | 85 | 86 | void error_handling(char* message) 87 | { 88 | fputs(message,stderr); 89 | fputc('\n',stderr); 90 | exit(1); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /edge_trigger_epoll_serv_clnt/edge_trigger_epoll_serv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #define BUF_SIZE 30 12 | #define EPOLL_SIZE 20 13 | 14 | void error_handler(const char* message); 15 | 16 | int main(int argc,char* argv[]) 17 | { 18 | int serv_sock,clnt_sock; 19 | struct sockaddr_in serv_addr,clnt_addr; 20 | int clnt_addr_sz; 21 | 22 | char buf[BUF_SIZE]; 23 | int str_len; 24 | 25 | int ep_fd,ep_cnt,i,flag; 26 | struct epoll_event event; 27 | struct epoll_event* pevents; 28 | 29 | if(argc!=2) 30 | { 31 | printf("Usage %s \n",argv[0]); 32 | exit(1); 33 | } 34 | 35 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 36 | 37 | memset(&serv_addr,0,sizeof(serv_addr)); 38 | serv_addr.sin_family=AF_INET; 39 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 40 | serv_addr.sin_port=htons(atoi(argv[1])); 41 | 42 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 43 | error_handler("bind() error"); 44 | 45 | if(listen(serv_sock,5)==-1) 46 | error_handler("listen() error"); 47 | 48 | ep_fd=epoll_create(EPOLL_SIZE); 49 | event.events=EPOLLIN; 50 | event.data.fd=serv_sock; 51 | pevents=malloc(sizeof(struct epoll_event)*EPOLL_SIZE); 52 | epoll_ctl(ep_fd,EPOLL_CTL_ADD,serv_sock,&event); 53 | 54 | while(1) 55 | { 56 | ep_cnt=epoll_wait(ep_fd,pevents,EPOLL_SIZE,-1); 57 | for(i=0;i 2 | 3 | #include 4 | 5 | #include 6 | 7 | #include 8 | 9 | #include 10 | 11 | #define BUF_SIZE 1024 12 | 13 | void error_handling(char* message); 14 | 15 | 16 | 17 | int main(int argc,char* argv[]) 18 | 19 | { 20 | 21 | int sock; 22 | 23 | struct sockaddr_in addr; 24 | 25 | FILE* fp; 26 | 27 | char buf[BUF_SIZE]; 28 | 29 | int str_len; 30 | 31 | if(argc!=3) 32 | 33 | { 34 | 35 | printf("Usage %s
\n",argv[0]); 36 | 37 | exit(1); 38 | 39 | } 40 | 41 | 42 | 43 | sock=socket(AF_INET,SOCK_STREAM,0); 44 | 45 | 46 | 47 | memset(&addr,0,sizeof(addr)); 48 | 49 | addr.sin_family=AF_INET; 50 | 51 | addr.sin_addr.s_addr=inet_addr(argv[1]); 52 | 53 | addr.sin_port=htons(atoi(argv[2])); 54 | 55 | 56 | 57 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 58 | 59 | error_handling("connect() error"); 60 | 61 | 62 | 63 | fp=fopen("1copy.txt","w+"); 64 | 65 | if(fp!=NULL) 66 | 67 | { 68 | 69 | while((str_len=read(sock,buf,BUF_SIZE))>0) 70 | 71 | { 72 | 73 | fwrite(buf,sizeof(char),str_len,fp); 74 | 75 | } 76 | 77 | write(sock,"Thank You!",11); 78 | 79 | fclose(fp); 80 | 81 | } 82 | 83 | close(sock); 84 | 85 | return 0; 86 | 87 | } 88 | 89 | 90 | 91 | void error_handling(char* message) 92 | 93 | { 94 | 95 | fputs(message,stderr); 96 | 97 | fputc('\n',stderr); 98 | 99 | exit(1); 100 | 101 | } -------------------------------------------------------------------------------- /ftp_serv_clnt/ftpserv.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include 4 | 5 | #include 6 | 7 | #include 8 | 9 | #include 10 | 11 | 12 | 13 | #define BUF_SIZE 1024 14 | 15 | 16 | 17 | 18 | 19 | void error_handling(char* message); 20 | 21 | int main(int argc,char* argv[]) 22 | 23 | { 24 | 25 | int serv_sock,clnt_sock; 26 | 27 | struct sockaddr_in serv_addr,clnt_addr; 28 | 29 | int clnt_addr_sz; 30 | 31 | FILE* fp; 32 | 33 | char buf[1024]; 34 | 35 | int str_len; 36 | 37 | 38 | 39 | if(argc!=2) 40 | 41 | { 42 | 43 | printf("Usage %s \n",argv[0]); 44 | 45 | exit(1); 46 | 47 | } 48 | 49 | 50 | 51 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 52 | 53 | if(serv_sock==-1) 54 | 55 | error_handling("socket() error"); 56 | 57 | 58 | 59 | memset(&serv_addr,0,sizeof(serv_addr)); 60 | 61 | serv_addr.sin_family=AF_INET; 62 | 63 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 64 | 65 | serv_addr.sin_port=htons(atoi(argv[1])); 66 | 67 | 68 | 69 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 70 | 71 | error_handling("bind() error"); 72 | 73 | 74 | 75 | if(listen(serv_sock,5)==-1) 76 | 77 | error_handling("listen() error"); 78 | 79 | 80 | 81 | clnt_addr_sz=sizeof(clnt_addr); 82 | 83 | if((clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz))==-1) 84 | 85 | error_handling("accept() error"); 86 | 87 | 88 | 89 | fp=fopen("1.txt","rb"); 90 | 91 | if(fp!=NULL) 92 | 93 | { 94 | 95 | while((str_len=fread(buf,sizeof(char),BUF_SIZE,fp))>0) 96 | 97 | { 98 | 99 | write(clnt_sock,buf,str_len); 100 | 101 | } 102 | 103 | shutdown(clnt_sock,SHUT_WR); 104 | 105 | memset(buf,0,sizeof(buf)); 106 | 107 | read(clnt_sock,buf,BUF_SIZE); 108 | 109 | printf("The message from Client:%s\n",buf); 110 | 111 | fclose(fp); 112 | 113 | } 114 | 115 | close(clnt_sock); 116 | 117 | close(serv_sock); 118 | 119 | return 0; 120 | 121 | } 122 | 123 | 124 | 125 | void error_handling(char* message) 126 | 127 | { 128 | 129 | fputs(message,stderr); 130 | 131 | fputc('\n',stderr); 132 | 133 | exit(1); 134 | 135 | } -------------------------------------------------------------------------------- /level_triger_epoll_serv_clnt/echo_clnt2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | void read_handling(int sock); 12 | void write_handling(int sock); 13 | 14 | int main(int argc,char* argv[]) 15 | { 16 | int sock; 17 | struct sockaddr_in addr; 18 | pid_t pid; 19 | 20 | if(argc!=3) 21 | { 22 | printf("Usage %s
\n",argv[0]); 23 | exit(1); 24 | } 25 | 26 | sock=socket(AF_INET,SOCK_STREAM,0); 27 | if(sock==-1) 28 | error_handling("socket() error"); 29 | 30 | memset(&addr,0,sizeof(addr)); 31 | addr.sin_family=AF_INET; 32 | addr.sin_addr.s_addr=inet_addr(argv[1]); 33 | addr.sin_port=htons(atoi(argv[2])); 34 | 35 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 36 | error_handling("connect() error"); 37 | 38 | pid=fork(); 39 | if(pid==0) 40 | { 41 | write_handling(sock); 42 | } 43 | else 44 | { 45 | read_handling(sock); 46 | } 47 | close(sock); 48 | return 0; 49 | } 50 | 51 | //写进程 52 | void write_handling(int sock) 53 | { 54 | char buf[BUF_SIZE]; 55 | while(1) 56 | { 57 | memset(buf,0,BUF_SIZE); 58 | //fputs("Input:",stdout); 59 | fgets(buf,BUF_SIZE,stdin); 60 | if(!strcmp(buf,"q\n")|| 61 | !strcmp(buf,"Q\n")) 62 | { 63 | shutdown(sock,SHUT_WR); 64 | return; 65 | } 66 | write(sock,buf,strlen(buf)); 67 | } 68 | } 69 | 70 | //读进程 71 | void read_handling(int sock) 72 | { 73 | int str_len; 74 | char buf[BUF_SIZE]; 75 | while(1) 76 | { 77 | str_len=read(sock,buf,BUF_SIZE-1); 78 | if(str_len<=0) 79 | return; 80 | buf[str_len]=0; 81 | printf("the message from server:%s\n",buf); 82 | } 83 | } 84 | 85 | 86 | void error_handling(char* message) 87 | { 88 | fputs(message,stderr); 89 | fputc('\n',stderr); 90 | exit(1); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /level_triger_epoll_serv_clnt/epoll_serv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #define BUF_SIZE 30 10 | #define EVENT_SIZE 30 11 | #define EPOLL_SIZE 100 12 | 13 | void error_handler(const char* message); 14 | 15 | int main(int argc,char* argv[]) 16 | { 17 | int serv_sock,clnt_sock; 18 | struct sockaddr_in serv_addr,clnt_addr; 19 | int clnt_addr_sz; 20 | 21 | char buf[BUF_SIZE]; 22 | int str_len; 23 | 24 | int ep_fd,evt_num,i;//epoll的文件描述符 25 | struct epoll_event event;//用于注册socket的事件 26 | struct epoll_event* pevents;//用于保存激活事件的数组 27 | 28 | 29 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 30 | 31 | memset(&serv_addr,0,sizeof(serv_addr)); 32 | serv_addr.sin_family=AF_INET; 33 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 34 | serv_addr.sin_port=htons(atoi(argv[1])); 35 | 36 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 37 | error_handler("bind() error"); 38 | 39 | if(listen(serv_sock,5)==-1) 40 | error_handler("listen() error"); 41 | 42 | ep_fd=epoll_create(EPOLL_SIZE); 43 | event.events=EPOLLIN; 44 | event.data.fd=serv_sock; 45 | 46 | epoll_ctl(ep_fd,EPOLL_CTL_ADD,serv_sock,&event); 47 | 48 | pevents=malloc(sizeof(struct epoll_event)*EVENT_SIZE); 49 | 50 | while(1) 51 | { 52 | evt_num = epoll_wait(ep_fd,pevents,EVENT_SIZE,-1); 53 | for(i=0;i #include #include #include #include #define BUF_SIZE 1024 void error_handling(const char* message); int main(int argc,char* argv[]) { int sock; struct sockaddr_in addr,sender_addr; char buf[BUF_SIZE]; int str_len; int sender_addr_sz; struct ip_mreq join_addr; const int loopback = 0; sock=socket(AF_INET,SOCK_DGRAM,0); memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); addr.sin_port=htons(atoi(argv[2])); setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char*)&loopback,sizeof(loopback)); join_addr.imr_multiaddr.s_addr=inet_addr(argv[1]); 2 | join_addr.imr_interface.s_addr=htonl(INADDR_ANY); 3 | setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&join_addr,sizeof(join_addr)); 4 | 5 | if(bind(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 6 | error_handling("bind error"); 7 | while(1) 8 | { 9 | str_len=recvfrom(sock,buf,BUF_SIZE-1,0,NULL,0); 10 | if(!str_len) 11 | break; 12 | buf[str_len]=0; 13 | fputs(buf,stdout); 14 | } 15 | close(sock); 16 | return 0; 17 | } 18 | void error_handling(const char* message) 19 | { 20 | fputs(message,stderr); 21 | fputc('\n',stderr); 22 | exit(1); 23 | } -------------------------------------------------------------------------------- /multicast_serv_clnt/sender.c: -------------------------------------------------------------------------------- 1 | #include #include #include #include #include 2 | #define BUF_SIZE 1024 3 | void error_handling(const char* message); 4 | int main(int argc ,char* argv[]) { int sock; struct sockaddr_in addr; int time_live; FILE* fp; char buf[BUF_SIZE]; const int loopback = 0; if(argc!=3) { printf("Usage \n",argv[1],argv[2]); exit(1); } 5 | sock=socket(AF_INET,SOCK_DGRAM,0); if(sock==-1) { error_handling("socket error"); } 6 | memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=inet_addr(argv[1]); addr.sin_port=htons(atoi(argv[2])); 7 | setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char*)&loopback,sizeof(loopback)); 8 | time_live=64;//设置生存时间为64,也就是最多经过64个路由器的转发 setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(void*)&time_live,sizeof(time_live)); 9 | fp=fopen("news.txt","r"); if(fp==NULL) error_handling("fopen error"); 10 | 11 | while(!feof(fp)) { fgets(buf,BUF_SIZE,fp); sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr)); sleep(2); } close(fp); close(sock); return 0; } 12 | void error_handling(const char* message) { fputs(message,stderr); fputc('\n',stderr); exit(1); } -------------------------------------------------------------------------------- /multiprocess_save_message_serv_clnt/multi_pro_clnt .c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | void read_handling(int sock); 12 | void write_handling(int sock); 13 | 14 | int main(int argc,char* argv[]) 15 | { 16 | int sock; 17 | struct sockaddr_in addr; 18 | pid_t pid; 19 | 20 | if(argc!=3) 21 | { 22 | printf("Usage %s
\n",argv[0]); 23 | exit(1); 24 | } 25 | 26 | sock=socket(AF_INET,SOCK_STREAM,0); 27 | if(sock==-1) 28 | error_handling("socket() error"); 29 | 30 | memset(&addr,0,sizeof(addr)); 31 | addr.sin_family=AF_INET; 32 | addr.sin_addr.s_addr=inet_addr(argv[1]); 33 | addr.sin_port=htons(atoi(argv[2])); 34 | 35 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 36 | error_handling("connect() error"); 37 | 38 | pid=fork(); 39 | if(pid==0) 40 | { 41 | write_handling(sock); 42 | } 43 | else 44 | { 45 | read_handling(sock); 46 | } 47 | close(sock); 48 | return 0; 49 | } 50 | 51 | //写进程 52 | void write_handling(int sock) 53 | { 54 | char buf[BUF_SIZE]; 55 | while(1) 56 | { 57 | memset(buf,0,BUF_SIZE); 58 | //fputs("Input:",stdout); 59 | fgets(buf,BUF_SIZE,stdin); 60 | if(!strcmp(buf,"q\n")|| 61 | !strcmp(buf,"Q\n")) 62 | { 63 | shutdown(sock,SHUT_WR); 64 | return; 65 | } 66 | write(sock,buf,strlen(buf)); 67 | } 68 | } 69 | 70 | //读进程 71 | void read_handling(int sock) 72 | { 73 | int str_len; 74 | char buf[BUF_SIZE]; 75 | while(1) 76 | { 77 | str_len=read(sock,buf,BUF_SIZE-1); 78 | if(str_len<=0) 79 | return; 80 | buf[str_len]=0; 81 | printf("the message from server:%s\n",buf); 82 | } 83 | } 84 | 85 | 86 | void error_handling(char* message) 87 | { 88 | fputs(message,stderr); 89 | fputc('\n',stderr); 90 | exit(1); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /multiprocess_save_message_serv_clnt/pipe_server.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #define BUF_SIZE 1024 8 | 9 | 10 | void error_handling(const char* message); 11 | 12 | int main(int argc,char* argv[]) 13 | { 14 | int serv_sock,clnt_sock; 15 | struct sockaddr_in serv_addr,clnt_addr; 16 | int clnt_addr_sz,str_len; 17 | char buf[BUF_SIZE]; 18 | pid_t pid; 19 | int fds[2]; 20 | FILE* pf; 21 | 22 | if(argc!=2) 23 | { 24 | printf("Usage %s ",argv[0]); 25 | exit(1); 26 | } 27 | 28 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 29 | if(serv_sock==-1) 30 | { 31 | error_handling("socket() error"); 32 | } 33 | 34 | memset(&serv_addr,0,sizeof(serv_addr)); 35 | serv_addr.sin_family=AF_INET; 36 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 37 | serv_addr.sin_port=htons(atoi(argv[1])); 38 | 39 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 40 | error_handling("bind() error"); 41 | 42 | if(listen(serv_sock,5)==-1) 43 | error_handling("listen() error"); 44 | pipe(fds); 45 | pid = fork(); 46 | if(pid==0) 47 | { 48 | close(serv_sock); 49 | pf=fopen("logs.txt","a+"); 50 | if(pf==NULL) return 0; 51 | while(1) 52 | { 53 | memset(buf,0,BUF_SIZE); 54 | str_len=read(fds[0],buf,BUF_SIZE); 55 | if(!strcmp(buf,"q\n")) 56 | { 57 | puts("Client disconnected..."); 58 | fclose(pf); 59 | break; 60 | } 61 | fwrite(buf,sizeof(char),str_len,pf); 62 | } 63 | } 64 | else 65 | { 66 | while(1) 67 | { 68 | clnt_addr_sz=sizeof(clnt_addr); 69 | clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz); 70 | if(clnt_sock==-1) 71 | { 72 | error_handling("accept() error"); 73 | } 74 | else 75 | { 76 | puts("Client connect succeed!"); 77 | } 78 | 79 | pid=fork(); 80 | 81 | if(pid==0) 82 | { 83 | while(1) 84 | { 85 | str_len = read(clnt_sock,buf,BUF_SIZE); 86 | if(str_len<=0) 87 | { 88 | write(fds[1],"q\n",2); 89 | close(clnt_sock); 90 | break; 91 | } 92 | write(clnt_sock,buf,str_len); 93 | write(fds[1],buf,str_len); 94 | } 95 | } 96 | else 97 | { 98 | close(clnt_sock); 99 | } 100 | } 101 | } 102 | close(serv_sock); 103 | return 0; 104 | } 105 | 106 | void error_handling(const char* message) 107 | { 108 | fputs(message,stderr); 109 | fputc('\n',stderr); 110 | exit(1); 111 | } 112 | 113 | -------------------------------------------------------------------------------- /multiprocess_serv_clnt/multi_pro_clnt.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | void read_handling(int sock); 12 | void write_handling(int sock); 13 | 14 | int main(int argc,char* argv[]) 15 | { 16 | int sock; 17 | struct sockaddr_in addr; 18 | pid_t pid; 19 | 20 | if(argc!=3) 21 | { 22 | printf("Usage %s
\n",argv[0]); 23 | exit(1); 24 | } 25 | 26 | sock=socket(AF_INET,SOCK_STREAM,0); 27 | if(sock==-1) 28 | error_handling("socket() error"); 29 | 30 | memset(&addr,0,sizeof(addr)); 31 | addr.sin_family=AF_INET; 32 | addr.sin_addr.s_addr=inet_addr(argv[1]); 33 | addr.sin_port=htons(atoi(argv[2])); 34 | 35 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 36 | error_handling("connect() error"); 37 | 38 | pid=fork(); 39 | if(pid==0) 40 | { 41 | write_handling(sock); 42 | } 43 | else 44 | { 45 | read_handling(sock); 46 | } 47 | close(sock); 48 | return 0; 49 | } 50 | 51 | //写进程 52 | void write_handling(int sock) 53 | { 54 | char buf[BUF_SIZE]; 55 | while(1) 56 | { 57 | memset(buf,0,BUF_SIZE); 58 | //fputs("Input:",stdout); 59 | fgets(buf,BUF_SIZE,stdin); 60 | if(!strcmp(buf,"q\n")|| 61 | !strcmp(buf,"Q\n")) 62 | { 63 | shutdown(sock,SHUT_WR); 64 | return; 65 | } 66 | write(sock,buf,strlen(buf)); 67 | } 68 | } 69 | 70 | //读进程 71 | void read_handling(int sock) 72 | { 73 | int str_len; 74 | char buf[BUF_SIZE]; 75 | while(1) 76 | { 77 | str_len=read(sock,buf,BUF_SIZE); 78 | if(str_len<=0) 79 | return; 80 | buf[str_len]=0; 81 | printf("the message from server:%s\n",buf); 82 | } 83 | } 84 | 85 | 86 | void error_handling(char* message) 87 | { 88 | fputs(message,stderr); 89 | fputc('\n',stderr); 90 | exit(1); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /multiprocess_serv_clnt/multi_pro_server.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | 12 | void child_handling(int sig) 13 | { 14 | pid_t pid; 15 | int status; 16 | if(sig==SIGCHLD) 17 | { 18 | pid=waitpid(-1,&status,WNOHANG); 19 | if(WIFEXITED(status)) 20 | { 21 | printf("child process %d exit.\n",pid); 22 | //printf("child process %d exit.\n",WEXITSTATUS(status)); 23 | } 24 | } 25 | } 26 | 27 | int main(int argc,char* argv[]) 28 | { 29 | int serv_sock,clnt_sock; 30 | struct sockaddr_in serv_addr,clnt_addr; 31 | int clnt_addr_sz; 32 | char buf[BUF_SIZE]; 33 | int str_len,state; 34 | pid_t pid; 35 | struct sigaction sig; 36 | 37 | if(argc!=2) 38 | { 39 | printf("Usage %s \n",argv[0]); 40 | exit(1); 41 | } 42 | 43 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 44 | if(serv_sock==-1) 45 | error_handling("socket error"); 46 | 47 | memset(&serv_addr,0,sizeof(serv_addr)); 48 | serv_addr.sin_family=AF_INET; 49 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 50 | serv_addr.sin_port=htons(atoi(argv[1])); 51 | 52 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 53 | error_handling("bind() error"); 54 | 55 | if(listen(serv_sock,5)==-1) 56 | error_handling("listen() error"); 57 | 58 | sig.sa_handler=child_handling; 59 | sigemptyset(&sig.sa_mask); 60 | sig.sa_flags=0; 61 | state=sigaction(SIGCHLD,&sig,0); 62 | while(1) 63 | { 64 | clnt_addr_sz=sizeof(clnt_addr); 65 | clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz); 66 | if(clnt_sock==-1) 67 | continue; 68 | else 69 | puts("new client connected..."); 70 | pid = fork(); 71 | if(pid==-1) 72 | { 73 | close(clnt_sock); 74 | continue; 75 | } 76 | if(pid==0) 77 | { 78 | while(1) 79 | { 80 | str_len=read(clnt_sock,buf,sizeof(buf)); 81 | if(str_len<=0) 82 | break; 83 | write(clnt_sock,buf,str_len); 84 | } 85 | close(clnt_sock); 86 | puts("client disconnected..."); 87 | return 0; 88 | } 89 | else 90 | close(clnt_sock); 91 | } 92 | close(serv_sock); 93 | return 0; 94 | } 95 | 96 | 97 | void error_handling(char* message) 98 | { 99 | fputs(message,stderr); 100 | fputc('\n',stderr); 101 | exit(1); 102 | } -------------------------------------------------------------------------------- /multithread_serv_clnt/chat_clnt.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #define BUF_SIZE 30 8 | void read_handling(void* param) 9 | { 10 | char buff[BUF_SIZE]; 11 | int str_len; 12 | int sock=*((int*)param); 13 | while(1) 14 | { 15 | str_len = read(sock,buff,BUF_SIZE-1); 16 | if(str_len<=0) 17 | break; 18 | buff[str_len]=0; 19 | printf("the message from server:%s\n",buff); 20 | } 21 | } 22 | 23 | void write_handling(void* param) 24 | { 25 | char buf[BUF_SIZE]; 26 | int sock=*((int*)param); 27 | while(1) 28 | { 29 | fputs("input:",stdout); 30 | fgets(buf,BUF_SIZE,stdin); 31 | if(!strcmp(buf,"q\n")|| 32 | !strcmp(buf,"Q\n")) 33 | exit(1); 34 | write(sock,buf,strlen(buf)); 35 | } 36 | } 37 | 38 | 39 | int main(int argc,char* argv[]) 40 | { 41 | int sock; 42 | struct sockaddr_in addr; 43 | sock=socket(AF_INET,SOCK_STREAM,0); 44 | pthread_t tid1,tid2; 45 | memset(&addr,0,sizeof(addr)); 46 | addr.sin_family=AF_INET; 47 | addr.sin_addr.s_addr=inet_addr(argv[1]); 48 | addr.sin_port=htons(atoi(argv[2])); 49 | 50 | connect(sock,(struct sockaddr*)&addr,sizeof(addr)); 51 | pthread_create(&tid1,NULL,(void*)write_handling,&sock); 52 | pthread_create(&tid2,NULL,(void*)read_handling,&sock); 53 | pthread_join(tid1,NULL); 54 | pthread_join(tid2,NULL); 55 | close(sock); 56 | return 0; 57 | } 58 | -------------------------------------------------------------------------------- /multithread_serv_clnt/chat_server.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #define BUF_SIZE 30 8 | #define CLNT_SIZE 30 9 | 10 | int clnt_socks[CLNT_SIZE]; 11 | int clntcount=0; 12 | pthread_mutex_t mt; 13 | 14 | void* clnt_handling(void* param) 15 | { 16 | char buf[BUF_SIZE]; 17 | int i,str_len; 18 | int clnt_sock=*((int*)param); 19 | while(1) 20 | { 21 | str_len=read(clnt_sock,buf,BUF_SIZE-1); 22 | if(str_len<=0) 23 | break; 24 | buf[str_len]=0; 25 | write(clnt_sock,buf,BUF_SIZE); 26 | } 27 | 28 | close(clnt_sock); 29 | pthread_mutex_lock(&mt); 30 | for(i=0;i\n",argv[0]); 53 | exit(1); 54 | } 55 | pthread_mutex_init(&mt,NULL); 56 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 57 | 58 | memset(&serv_addr,0,sizeof(serv_addr)); 59 | serv_addr.sin_family=AF_INET; 60 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 61 | serv_addr.sin_port=htons(atoi(argv[1])); 62 | 63 | bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); 64 | 65 | listen(serv_sock,5); 66 | while(1) 67 | { 68 | clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz); 69 | pthread_mutex_lock(&mt); 70 | clnt_socks[clntcount++]=clnt_sock; 71 | pthread_mutex_unlock(&mt); 72 | 73 | pthread_create(&tid,NULL,clnt_handling,(void*)&clnt_sock); 74 | pthread_detach(tid); 75 | printf("%s Connected\n",inet_ntoa(clnt_addr.sin_addr)); 76 | } 77 | close(serv_sock); 78 | pthread_mutext_destroy(&mt); 79 | return 0; 80 | } 81 | -------------------------------------------------------------------------------- /multithread_serv_clnt/chat_server2.c: -------------------------------------------------------------------------------- 1 | ///////////////////// 2 | ///////////////////// 3 | //File:chat_server2.c 4 | //version:1.0 5 | //Author:Hyman 6 | //Date:2016/11/15 7 | //Description:这是一个共享buff的多线程的服务端框架,这种设计本身不够合理,每个客户端在和服务端交互完之后服务器才会 8 | //和下一个客户端进行会话,本例子仅供试验说明问题使用。 9 | ///////////////////// 10 | ///////////////////// 11 | ///////////////////// 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #define BUF_SIZE 30 20 | 21 | char buff[BUF_SIZE]; 22 | pthread_mutex_t mt; 23 | 24 | void* clnt_handling(void* param) 25 | { 26 | int str_len; 27 | int clnt_sock=*((int*)param); 28 | pthread_mutex_lock(&mt); 29 | while(1) 30 | { 31 | str_len=read(clnt_sock,buff,BUF_SIZE); 32 | if(str_len<=0) 33 | break; 34 | write(clnt_sock,buff,str_len); 35 | } 36 | pthread_mutex_unlock(&mt); 37 | } 38 | 39 | int main(int argc,char* argv[]) 40 | { 41 | int serv_sock,clnt_sock; 42 | struct sockaddr_in serv_addr,clnt_addr; 43 | int clnt_addr_sz; 44 | pthread_t tid; 45 | pthread_mutex_init(&mt,NULL); 46 | 47 | if(argc!=2) 48 | { 49 | printf("Usage %s \n",argv[0]); 50 | exit(1); 51 | } 52 | 53 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 54 | 55 | memset(&serv_addr,0,sizeof(serv_addr)); 56 | serv_addr.sin_family=AF_INET; 57 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 58 | serv_addr.sin_port=htons(atoi(argv[1])); 59 | 60 | bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); 61 | 62 | listen(serv_sock,5); 63 | while(1) 64 | { 65 | clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz); 66 | pthread_create(&tid,NULL,clnt_handling,(void*)&clnt_sock); 67 | pthread_detach(tid); 68 | } 69 | 70 | pthread_mutex_destroy(&mt); 71 | close(serv_sock); 72 | 73 | return 0; 74 | } 75 | -------------------------------------------------------------------------------- /poll_serv_clnt/echo_clnt2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | void read_handling(int sock); 12 | void write_handling(int sock); 13 | 14 | int main(int argc,char* argv[]) 15 | { 16 | int sock; 17 | struct sockaddr_in addr; 18 | pid_t pid; 19 | 20 | if(argc!=3) 21 | { 22 | printf("Usage %s
\n",argv[0]); 23 | exit(1); 24 | } 25 | 26 | sock=socket(AF_INET,SOCK_STREAM,0); 27 | if(sock==-1) 28 | error_handling("socket() error"); 29 | 30 | memset(&addr,0,sizeof(addr)); 31 | addr.sin_family=AF_INET; 32 | addr.sin_addr.s_addr=inet_addr(argv[1]); 33 | addr.sin_port=htons(atoi(argv[2])); 34 | 35 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 36 | error_handling("connect() error"); 37 | 38 | pid=fork(); 39 | if(pid==0) 40 | { 41 | write_handling(sock); 42 | } 43 | else 44 | { 45 | read_handling(sock); 46 | } 47 | close(sock); 48 | return 0; 49 | } 50 | 51 | //写进程 52 | void write_handling(int sock) 53 | { 54 | char buf[BUF_SIZE]; 55 | while(1) 56 | { 57 | memset(buf,0,BUF_SIZE); 58 | //fputs("Input:",stdout); 59 | fgets(buf,BUF_SIZE,stdin); 60 | if(!strcmp(buf,"q\n")|| 61 | !strcmp(buf,"Q\n")) 62 | { 63 | shutdown(sock,SHUT_WR); 64 | return; 65 | } 66 | write(sock,buf,strlen(buf)); 67 | } 68 | } 69 | 70 | //读进程 71 | void read_handling(int sock) 72 | { 73 | int str_len; 74 | char buf[BUF_SIZE]; 75 | while(1) 76 | { 77 | str_len=read(sock,buf,BUF_SIZE-1); 78 | if(str_len<=0) 79 | return; 80 | buf[str_len]=0; 81 | printf("the message from server:%s\n",buf); 82 | } 83 | } 84 | 85 | 86 | void error_handling(char* message) 87 | { 88 | fputs(message,stderr); 89 | fputc('\n',stderr); 90 | exit(1); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /poll_serv_clnt/poll_serv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define BUF_SIZE 30 9 | #define POLL_SIZE 20 10 | 11 | 12 | void error_handler(const char* message); 13 | int main(int argc,char* argv[]) 14 | { 15 | int serv_sock,clnt_sock; 16 | struct sockaddr_in serv_addr,clnt_addr; 17 | int clnt_addr_sz,str_len; 18 | char buf[BUF_SIZE]; 19 | 20 | struct pollfd fds[POLL_SIZE]; 21 | int plnum,fpnum,i; 22 | 23 | if(argc!=2) 24 | { 25 | printf("Usage %s \n",argv[0]); 26 | exit(1); 27 | } 28 | 29 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 30 | 31 | memset(&serv_addr,0,sizeof(serv_addr)); 32 | serv_addr.sin_family=AF_INET; 33 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 34 | serv_addr.sin_port=htons(atoi(argv[1])); 35 | 36 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 37 | error_handler("bind error"); 38 | 39 | if(listen(serv_sock,5)==-1) 40 | error_handler("listen error"); 41 | 42 | for(i=0;i 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | void read_handling(int sock); 12 | void write_handling(int sock); 13 | 14 | int main(int argc,char* argv[]) 15 | { 16 | int sock; 17 | struct sockaddr_in addr; 18 | pid_t pid; 19 | 20 | if(argc!=3) 21 | { 22 | printf("Usage %s
\n",argv[0]); 23 | exit(1); 24 | } 25 | 26 | sock=socket(AF_INET,SOCK_STREAM,0); 27 | if(sock==-1) 28 | error_handling("socket() error"); 29 | 30 | memset(&addr,0,sizeof(addr)); 31 | addr.sin_family=AF_INET; 32 | addr.sin_addr.s_addr=inet_addr(argv[1]); 33 | addr.sin_port=htons(atoi(argv[2])); 34 | 35 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 36 | error_handling("connect() error"); 37 | 38 | pid=fork(); 39 | if(pid==0) 40 | { 41 | write_handling(sock); 42 | } 43 | else 44 | { 45 | read_handling(sock); 46 | } 47 | close(sock); 48 | return 0; 49 | } 50 | 51 | //写进程 52 | void write_handling(int sock) 53 | { 54 | char buf[BUF_SIZE]; 55 | while(1) 56 | { 57 | memset(buf,0,BUF_SIZE); 58 | //fputs("Input:",stdout); 59 | fgets(buf,BUF_SIZE,stdin); 60 | if(!strcmp(buf,"q\n")|| 61 | !strcmp(buf,"Q\n")) 62 | { 63 | shutdown(sock,SHUT_WR); 64 | return; 65 | } 66 | write(sock,buf,strlen(buf)); 67 | } 68 | } 69 | 70 | //读进程 71 | void read_handling(int sock) 72 | { 73 | int str_len; 74 | char buf[BUF_SIZE]; 75 | while(1) 76 | { 77 | str_len=read(sock,buf,BUF_SIZE-1); 78 | if(str_len<=0) 79 | return; 80 | buf[str_len]=0; 81 | printf("the message from server:%s\n",buf); 82 | } 83 | } 84 | 85 | 86 | void error_handling(char* message) 87 | { 88 | fputs(message,stderr); 89 | fputc('\n',stderr); 90 | exit(1); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /select_serv_clnt/select_serv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #define BUF_SIZE 30 12 | 13 | void error_handler(const char* message); 14 | 15 | int main(int argc,char* argv[]) 16 | { 17 | int serv_sock,clnt_sock; 18 | struct sockaddr_in serv_addr,clnt_addr; 19 | int clnt_addr_sz; 20 | 21 | char buf[BUF_SIZE]; 22 | int str_len; 23 | 24 | fd_set rd_set,temp_set; 25 | int fd_max; 26 | struct timeval timeout; 27 | int fd_num,i; 28 | 29 | if(argc!=2) 30 | { 31 | printf("Usage %s ",argv[0]); 32 | exit(1); 33 | } 34 | 35 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 36 | if(serv_sock==-1) 37 | error_handler("socket error"); 38 | 39 | memset(&serv_addr,0,sizeof(serv_addr)); 40 | serv_addr.sin_family=AF_INET; 41 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 42 | serv_addr.sin_port=htons(atoi(argv[1])); 43 | 44 | if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) 45 | error_handler("bind error"); 46 | 47 | if(listen(serv_sock,5)==-1) 48 | error_handler("listen error"); 49 | 50 | FD_ZERO(&rd_set); 51 | FD_SET(serv_sock,&rd_set); 52 | fd_max=serv_sock; 53 | 54 | while(1) 55 | { 56 | temp_set=rd_set; 57 | timeout.tv_sec=5; 58 | timeout.tv_usec=0; 59 | 60 | fd_num=select(fd_max+1,&temp_set,NULL,NULL,&timeout); 61 | if(fd_num==-1) 62 | error_handler("select error"); 63 | if(fd_num==0) 64 | continue; 65 | 66 | for(i=0;i 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | void error_handling(char* message); 11 | void read_handling(int sock); 12 | void write_handling(int sock); 13 | 14 | int main(int argc,char* argv[]) 15 | { 16 | int sock; 17 | struct sockaddr_in addr; 18 | pid_t pid; 19 | 20 | if(argc!=3) 21 | { 22 | printf("Usage %s
\n",argv[0]); 23 | exit(1); 24 | } 25 | 26 | sock=socket(AF_INET,SOCK_STREAM,0); 27 | if(sock==-1) 28 | error_handling("socket() error"); 29 | 30 | memset(&addr,0,sizeof(addr)); 31 | addr.sin_family=AF_INET; 32 | addr.sin_addr.s_addr=inet_addr(argv[1]); 33 | addr.sin_port=htons(atoi(argv[2])); 34 | 35 | if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) 36 | error_handling("connect() error"); 37 | 38 | pid=fork(); 39 | if(pid==0) 40 | { 41 | write_handling(sock); 42 | } 43 | else 44 | { 45 | read_handling(sock); 46 | } 47 | close(sock); 48 | return 0; 49 | } 50 | 51 | //写进程 52 | void write_handling(int sock) 53 | { 54 | char buf[BUF_SIZE]; 55 | while(1) 56 | { 57 | memset(buf,0,BUF_SIZE); 58 | //fputs("Input:",stdout); 59 | fgets(buf,BUF_SIZE,stdin); 60 | if(!strcmp(buf,"q\n")|| 61 | !strcmp(buf,"Q\n")) 62 | { 63 | shutdown(sock,SHUT_WR); 64 | return; 65 | } 66 | write(sock,buf,strlen(buf)); 67 | } 68 | } 69 | 70 | //读进程 71 | void read_handling(int sock) 72 | { 73 | int str_len; 74 | char buf[BUF_SIZE]; 75 | while(1) 76 | { 77 | str_len=read(sock,buf,BUF_SIZE-1); 78 | if(str_len<=0) 79 | return; 80 | buf[str_len]=0; 81 | printf("the message from server:%s\n",buf); 82 | } 83 | } 84 | 85 | 86 | void error_handling(char* message) 87 | { 88 | fputs(message,stderr); 89 | fputc('\n',stderr); 90 | exit(1); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /semaphore_multithread_serv_clnt/sem_mul_serv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #define BUF_SIZE 1024 9 | 10 | sem_t sem; 11 | void* pthread_main(void* param) 12 | { 13 | int str_len; 14 | char buf[BUF_SIZE]; 15 | int clnt_sock=*((int*)param); 16 | while(1) 17 | { 18 | str_len=read(clnt_sock,buf,BUF_SIZE); 19 | if(str_len<=0) 20 | break; 21 | write(clnt_sock,buf,str_len); 22 | } 23 | sem_post(&sem); 24 | close(clnt_sock); 25 | } 26 | 27 | int main(int argc,char* argv[]) 28 | { 29 | int serv_sock,clnt_sock; 30 | struct sockaddr_in serv_addr,clnt_addr; 31 | int clnt_addr_sz; 32 | pthread_t thread_id; 33 | 34 | if(argc!=2) 35 | { 36 | printf("Usage %s \n",argv[0]); 37 | exit(1); 38 | } 39 | serv_sock=socket(AF_INET,SOCK_STREAM,0); 40 | 41 | memset(&serv_addr,0,sizeof(serv_addr)); 42 | serv_addr.sin_family=AF_INET; 43 | serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 44 | serv_addr.sin_port=htons(atoi(argv[1])); 45 | 46 | bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); 47 | 48 | listen(serv_sock,10); 49 | 50 | sem_init(&sem,0,5); 51 | while(1) 52 | { 53 | sem_wait(&sem); 54 | clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz); 55 | pthread_create(&thread_id,NULL,(void*)pthread_main,&clnt_sock); 56 | } 57 | //pthread_join(thread_id,NULL); 58 | sem_destroy(&sem); 59 | return 0; 60 | } 61 | -------------------------------------------------------------------------------- /singleProcess_serv_clnt/echo_clnt.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HymanLiuTS/TCPIPMod/c2428a715f7de3e43a887a3af95d61fd7c279e3e/singleProcess_serv_clnt/echo_clnt.c -------------------------------------------------------------------------------- /singleProcess_serv_clnt/echo_serv.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HymanLiuTS/TCPIPMod/c2428a715f7de3e43a887a3af95d61fd7c279e3e/singleProcess_serv_clnt/echo_serv.c --------------------------------------------------------------------------------