socket编程TCP通信

来源:互联网 发布:网络优化培训班 编辑:程序博客网 时间:2024/06/06 09:30
1.单进程:
server服务器:
#include<stdio.h>
  2 #include<sys/socket.h>
  3 #include<arpa/inet.h>
  4 #include<stdlib.h>
  5 #include<unistd.h>
  6 #include<string.h>
  7 #include<netinet/in.h>
  8 
  9 
 10 int connectfd,listenfd;
 11  struct sockaddr_in   serv_addr,cli_addr;
 12  int ret;
 13 socklen_t  cli_addr_len;
 14 void usage(const char* str)
 15 {
 16     printf("%s  [IP][port]\n",str);
 17 }
 18 
 19 static int  startup(const char *IP,int port){
 20 
 21     listenfd=socket(AF_INET,SOCK_STREAM,0);
 22      if(listenfd<0){
 23          perror("socket");
 24          exit(2);
 25          }
 26 
 27  serv_addr.sin_family= AF_INET;
 28  serv_addr.sin_port = htons( atoi( port) );
 29  serv_addr.sin_addr.s_addr = inet_addr(IP);
                                                                                            1,3           Top
 
 31 
 32  int   ret=bind(listenfd,(struct sockaddr*)(&(serv_addr)),sizeof(serv_addr));
 33 if(ret<0){
 34     perror("blind");
 35     exit(3);
 36     }
 37 
 38 ret=listen(listenfd,20);
 39 if(ret<0){
 40     perror("listen");
 41     exit(4);
 42     }
 43     return listenfd;
 44 }
 45 //serve : 127.0.0.1  888
 46 int main(int  argc,char* argv[])
 47 {
 48     if(argc!=3)
 49         usage(argv[0]);
 50         exit(1);
 51 
 52   int listen_sock=startup(argv[1],atoi(argv[2]));
 53  cli_addr_len=sizeof(cli_addr);
 54   connectfd=acccept(listen_sock,(struct sockaddr*)(&cli_addr),&cli_addr_len);
 55  if(connectfd<0){
 56      perror("connectfd");


                                                                                            28,3          51%
 exit(5);
 58      }
 59       printf("clie ip %s,clie port %d\n", inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
 60       int n=0;
 61       char buf[1024]={0};
 62       while(1){
 63           n=read(connectfd,buf,sizeof(buf)-1);
 64           if(n==0){
 65               printf("clie quit\n");
 66               break;
 67               }else if(n<0){
 68                   exit(6);
 69                   }else{
 70                       buf[n]=0;
 71                       printf("cli say :%s\n",buf);
 72                       write(connectfd,buf,strlen(buf));
 73                       }
 74 
 75           }
 76           close(connectfd);
 77           close(listenfd);
 78 
 79           return 0;
 80 }
client服务器:
1 #include<stdio.h>                                                                                         
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<string.h>
  5 #include<netinet/in.h>
  6 #include<sys/socket.h>
  7 #include<arpa/inet.h>
  8 
  9 
 10 
 11 void  usage(const char* str)
 12 {
 13     printf("%s,IP[],port[]",str);
 14 }
 15 
 16 int main(int argc,char* argv[])
 17 {
 18     if(argc!=3){
 19         usage(argv[0]);
 20         exit(0);
 21         }
 22   struct sockaddr_in serv_addr;
 23   int sockfd;
 24   sockfd=socket(AF_INET,SOCK_STREAM,0);
 25   if(sockfd<0){
 26       perror("sock");
 27       exit(1);
 28       }
 29       serv_addr.sin_family = AF_INET;
 serv_addr.sin_port = htons(atoi(argv[2]));
 31       serv_addr.sin_addr.s_addr = inet_addr(argv[1]); 
 32       // linl serve 
 33       int ret=connect(sockfd,(struct sockaddr*)(&serv_addr),sizeof(serv_addr));
 34       if(ret<0){
 35           perror("connect");
 36           exit(2);
 37           }
 38 
 39           int n=0;
 40           char buf[1024]={0};
 41           while(1){
 42               printf("client# ");
 43               fflush(stdout);
 44               n=read(0,buf,sizeof(buf)-1);
 45               buf[n-1]='\0';
 46               write(sockfd,buf,strlen(buf));
 47 
 48               n=read(sockfd,buf,sizeof(buf)-1);
 49               buf[n]=0;
 50               printf("server echo#: %s\n",buf);
 51               }
 52               close(sockfd);
 53               return 0;
 54 }       
多线程socket 
server:int main(int argc,char* argv[])
127 {
128 
129     if(argc!=3){
130         usage(argv[0]);
131         exit(1);
132         }
133             int listen_sock=startup(argv[1],argv[2]);
134             cli_addr_len=sizeof(cli_addr);
135         while(1){
136             connectfd=accept(listen_sock,(struct sockaddr*)(&cli_addr),&cli_addr_len);
137             if(connectfd>0){
138                 pid_t id=fork();
139                 if(id==0){//child
140                     if(fork()>0){
141                         exit(1);
142                         }else{
143                             char buf[1024];
144                             while(1){
145 
146                                  int         n=read(connectfd,buf,sizeof(buf)-1);
147                                     if(n==0){
148                                      printf("cli is quit");
149                                         break;
150                                        }else if(n<0){
151                                                exit(6);
                                                 }else {
153                                                     buf[n]=0;
154                                                     printf("cli is say:%s\n",buf);
155                                                      write(connectfd,buf,strlen(buf));
156                                                       }
157                                       }
158                                 }
159                     }else{//father
160                         close(connectfd);
161                         }
162                 }
163                 else{
164                     break;
165                     }
166             }
167 }
多进程sock
server:
 //Version 2 
 84 //void* newpthread(char* arg)
 85 //{
 86  ///    int s=(int) arg;
 87 //   char buf[1024]={0};
 88 //   while(1){
 89  //   int        n=read(s,buf,sizeof(buf)-1);
 90 //       if(n==0){
 91 //           printf("cli is quit");
 92 //           break;
 93 //           }else if(n<0){
 94 //               exit(6);
 95 //               }else {
 96 //                   buf[n]=0;
 97 //                   printf("cli is say:%s\n",buf);
 98 //                   write(s,buf,strlen(buf));
 99 //                   }
100 //       }
101 //       pthread_exit(NULL);
102 //}
103 //int  main(int argc ,char* argv[])
104 //{/
105 //  if(argc!=3){
106 //      usage(argv[1]);
107 //      exit(1);
108 //      }
109 


               //      int listen_sock=startup(argv[1],atoi(argv[2]));
111   //  cli_addr_len=sizeof(cli_addr);
112   //  connectfd=accept(listen_sock,(struct sockaddr*)(&cli_addr),&cli_addr_len); 
113 //   if(connectfd<0){
114 //   perror("connectfd");
115 //   exit(5);
116 //   }
117 //    printf("clie ip %s,clie port %d\n", inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
118   //   pthread_t tid;
119 //   pthread_create(&tid,NULL,newpthread,(void*)connectfd);
120 //   pthread_detach(tid);
121 
122 //   return 0;
123 //}
原创粉丝点击