网络编程套接字(2)-TCP

在上一篇博客中,我们介绍了套接字的相关内容,编写了套接字-udp版本的网络通信代码。

 

这篇文章将介绍,TCP协议版本的网络通信方式,以及多线程,多进程版本的网络通信方法。

TCP协议:

TCP是TCP/IP协议栈中的传输层的协议,TCP协议又叫传输控制协议(Transport Control Protocal),是面向连接的可靠的字节流服务。它的可靠性体现在:3次握手建立连接,滑动窗口机制,一定的拥塞避免算法,流量控制,以及一定的超时重传机制。在本文中并不介绍它的可靠性的实现机制。。。

下面我们来编写TCP 版本的网络通信代码

首先是单进程的服务器

  1 #include<stdlib.h>                                                                         
  2 #include<sys/socket.h>
  3 #include<arpa/inet.h>
  4 #include<stdio.h>
  5 #include<netinet/in.h>
  6 #include<string.h>
  7 #include<unistd.h>
  8 int main (int arg,char*argv[])
  9 {
 10     if(3!=arg)
 11     {
 12       return 1;
 13     }
 14     int fd =socket(AF_INET,SOCK_STREAM,0);//创建文件描述符
 15     if(fd<0)
 16     {
 17       perror("socket");
 18       return 1;
 19     }
 20     struct sockaddr_in server;//创建保存服务器IP地址和端口号的结构体
 21     server.sin_family=AF_INET;//协议类型
 22     server.sin_addr.s_addr=inet_addr(argv[1]);//保存IP
 23     server.sin_port=htons(atoi(argv[2]));//保存端口号
 24     int ret=bind(fd,(struct sockaddr*)&server,sizeof(server));//将IP地址和端口号填充到套接字结构中
 25     if(ret<0)
 26     {
 27       perror("bind");
 28       return 1;
 29     }
 30     //把tcp socket变成了被动模式,此时你才能允许客户端来建立连接
 31     ret=listen(fd,5); //5表示同一时间,最多可以等待的客户端数,                            
 32                       //相当于火锅店门口的等待座位,决定了服务器的并发的量
 33     if(ret<0)
 34     {
 35       perror("listen");
 36       return 1;
 37     }
 38     while(1)
 39     {
 40       struct sockaddr_in client;//创建保存客户端信息的 结构体
 41       socklen_t len=sizeof(client);
 42       int new_fd=accept(fd,(struct sockaddr*)&client,&len);//接受客户端的信息,同时把客户端的ip和端口填充到套接字结构
 43       if(new_fd<0)                                         //这样服务器的套接字就填充完整了,有了目的信息
 44       {                                                    //实际上就是已经连接上了客户端
 45         perror("accpet");                                        
 46         continue;                                                                          
 46         continue;
 47       }
 48       while(1)
 49       {
 50       char buf[1024]={0};
 51       int read_size=read(new_fd,buf,sizeof(buf)-1);
 52       if(read_size<0)
 53       {
 54        perror("read");
 55        continue;
 56       }
 57       if(read_size==0)
 58       {
 59         printf("read done!");
 60         close(new_fd);
 61         break;
 62       }
 63       buf[read_size]='\0';
 64       printf("client say: %s\n",buf);
 65       write(new_fd,buf,strlen(buf));
 66       }
 67     }
 68 
 69 
 70 
 71     close(fd);
 72     return 0;
 73 }
 74 
 75                       
                                                                  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值