简单实现TCP服务端与客户端

 1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<errno.h>
  5 #include<string.h>
  6 #include<sys/socket.h>
  7 #include<netinet/in.h>
  8 #include<arpa/inet.h>
  9 /*
 10  *TCP服务端-----简单的网络聊天程序
 11  *1 创建socket
 12  *2 为socket绑定地址端口
 13  *3 开始监听socket---告诉操作系统,开始接收连接请求,并且处理连接请求
 14  *4 接收连接请求-获取新连接的socket(sip sport dip dport proto)
 15  *5 收发数据----recv/send
 16  *6 关闭新建socket(程序结束时关闭最开始的socket)
 17  * */
 18 
 19 
 20 int main(int argc,char* argv[])
 21 {
 22         if(argc!=3){ 
 23                 printf("Usage:./tcp_serve ip port\n");
 24                 return -1;
 25         }
 26         //1 创建socket
 27         int listen_fd=-1; 
 28         listen_fd=socket(AF_INET,SOCK_STREAM,0);
 29         if(listen_fd<0){
 30                 perror("socket");
 31                 return -1;
 32         }
 33         struct sockaddr_in lst_addr;
 34         lst_addr.sin_family=AF_INET;
 35         lst_addr.sin_port=htons(atoi(argv[2]));
 36         lst_addr.sin_addr.s_addr=inet_addr(argv[1]);
 37 
 38         socklen_t len=sizeof(struct sockaddr_in);
 39         //2 为socket绑定地址端口
 40         int ret=bind(listen_fd,(struct sockaddr*)&lst_addr,len);
 41 
 42         if(ret<0){
 43                 perror("bind");
 44                 return -1;
 45         }
 46         //3 开始监听socket---告诉操作系统,开始接收连接请求,并且处理连接请求
 47         if(listen(listen_fd,5)<0){
 48                 perror("listen");
 49                 return -1;
 50         }
 51 
 52         while(1){
 53                 struct sockaddr_in cli_addr;
 54                 len=sizeof(struct sockaddr_in);
 55                 int new_fd;
 56          // 4 接收连接请求-获取新连接的socket(sip sport dip dport proto)
 57                 new_fd=accept(listen_fd,(struct sockaddr*)&cli_addr,&len);
 58                 if(new_fd<0){
 59                         perror("accept");
 60                         continue;
 61                 }
 62         //5 收发数据----recv/send
 63                 char buff[1024];
 64                 while(1){
 65                         ret=recv(new_fd,buff,1023,0);//实际接收长度
 66                         if(ret==0){
 67                             printf("client shutdown!!\n");
 68                             break;
 69                         }else if(ret<0){
 70                             if(errno==EINTR||errno==EAGAIN){
 71                                 continue;
 72                             }
 73                             break;
 74                         }
 75                         printf("client say:%s\n",buff);
 76 
 77                         char tmp[1024];
 78                         printf("input:");
 79                         fflush(stdout);
 80                         scanf("%s",tmp);
 81                         send(new_fd,tmp,strlen(tmp),0);
 82                 }
 83                 close(new_fd);
 84         }
 85         //6 关闭新建socket(程序结束时关闭最开始的socket)
 86         close(listen_fd);
 87         return 0;
 88 }
 1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<errno.h>
  5 #include<string.h>
  6 #include<sys/socket.h>
  7 #include<netinet/in.h>
  8 #include<arpa/inet.h>
  9 /*
 10    *TCP客户端-----简单的网络聊天程序
 11    *1 创建socket
 12    *2 为socket绑定地址端口-----在客户端不推荐手动绑定端口,一个端口只能被一个服务器使用
 13    *3 向服务端发起连接请求  connect()
 14    *4 收发数据----recv/send
 15    *5 关闭socket
 16 * */
 17 
 18 int main(int argc,char *argv[]){
 19     if(argc!=3){
 20         printf("Usage:./tcp_client ip port\n");
 21         return -1;
 22     }
 23     //1 创建socket
 24     int sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 25     if(sockfd<0){
 26         perror("socket");
 27         return -1;
28     }
 29 
 30     struct sockaddr_in ser_addr;
 31     ser_addr.sin_family=AF_INET;
 32     ser_addr.sin_port=htons(atoi(argv[2]));
 33     ser_addr.sin_addr.s_addr=inet_addr(argv[1]);
 34 
 35     socklen_t len=sizeof(struct sockaddr_in);
 36     //2 向服务器发起连接
 37     int ret=connect(sockfd,(struct sockaddr*)&ser_addr,len);
 38     if(ret<0){
 39         printf("connect");
 40         return -1;
 41     }
 42    //3 收发数据----recv/send
 43     while(1){
 44         char buff[1024]={0};
 45         printf("input:");
 46         fflush(stdout);
 47         scanf("%s",buff);
 48         //通过socket发送数据
 49         send(sockfd,buff,strlen(buff),0);
 50         //接收数据
 51         char tmp[1024]={0};
 52         recv(sockfd,tmp,1023,0);
 53         printf("server say:%s\n",tmp);
 54 
55     }
 56 
 57    //5 关闭socket
 58     close(sockfd);
 59     return 0;
 60 }
                                 

猜你喜欢

转载自blog.csdn.net/na_hanqiannan/article/details/81664834