TCP编程
函数调用流程图:

Socket创建函数:
1 |
|
- 绑定函数:
1 |
|
- 监听函数:
1 |
|
- 阻塞等待连接函数:
1 |
|
- TCP Sevser创建示例:
1 |
|
- 连接服务器函数
1 |
|
- TCP Client创建示例:
1 |
|
从上面的示例可以看出,服务器和客户端通信的时候读写的都是客户端创建的socket文件,服务器自己创建的socket文件只是由来等待被连接,连接后就用accept()返回的的客户端的socket文件通信。
运行结果:

小结:
上面的示例存在一个问题就是服务器只能连接一个客户端,连接到一个客户端后服务器就没有再阻塞等待新的客户端连接了,如果要实现一个服务端同时服务多个客户端的并发访问,需要用到io多路复用或者每个客户端服务器都创建一个线程或进程为新连接的客户端服务。
补充知识
使用ifconfig可以虚拟一个网卡并指定网卡ip地址:
- 服务器监听任意ip加端口号
指定地址为0.0.0.0的地址,这样服务器程序的运行就不受机器网卡ip的限制。
1 | sin.sin addr.s addr = htonl(INADDR_ANY); //INADDR_ANY代表任意ip地址,进程对所有网卡凡是从监听的端口号过来的数据都会收到 |

- 服务器获取新连接的客户端ip地址
1 |
|
补充知识:
- UDP网络编程不同于文件io单独封装的函数
发送数据函数
1 |
|
接收数据函数
1 |
|
MSG_PEEK方式读数据:常用在对一包数据进行协议长度检查,看是否已经接收到一包完整的数据,下次再调用recv()读数据还是会读到和上次一样的数据,因为上次以MSG_PEEK方式读数据,文件描述符(流)的偏移量并没有改变。
- 本文作者: 龙兄嵌入式
- 本文链接: https://hexo.880755.xyz/1970/01/01/zblog/download/54.TCP编程基础/
