在上一篇博客中,我们介绍了套接字的相关内容,编写了套接字-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