lwip 一个服务器连接多个客户端_【网络】Linux TCP客户端与服务器的C代码实现

ddd8a5f7a273908ea8ceba1539757c61.png

在计算机网络的编程中,OSI参考模型中规定了各层的定义与功能。针对于其中的网络层,传输层,以及应用层这三层,整体称之为网络协议栈,常见有PC平台的TCP/IP,嵌入式平台的lwIP,CycloneTCP等。

关于数据链路层和物理层,这是硬件层面的协议,由网卡和MAC/LLC去实现。

本文中的TCP server 和 client,为基于软件层面(TCP/IP协议栈)的Socket应用开发。

1 Socket

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

数据结构:注意sockaddr_in 和 sockaddr的区别(前者具体,后者抽象)

#ifdef CONFIG_NET_IPv6

函数接口:

int 

2 TCP 与 UDP

TCP(Transmission Control Protocol,传输控制协议是面向连接的,基于数据流的可靠协议,在正式通信之前必须建立起连接。UDP(User Data Protocol,用户数据报协议)是一个非连接的数据报协议。TCP的服务器模式比UDP的服务器模式多了listen,accept函数。TCP客户端比UDP客户端多了connect函数。

这里只谈TCP的客户端与服务器。

3 TCP server

TCP server的实现流程:

1、创建一个socket,用函数socket();

2、绑定IP地址、端口等信息到socket上,用函数bind();

3、开启监听,用函数listen();

4、接收客户端上来的连接,用函数accept();

5、收发数据,用函数send()和recv(),或者read()和write();

6、关闭网络连接;

#include 

4 TCP client

TCP client的实现流程:

1、创建一个socket,用函数socket();

2、连接服务器,用函数connect();

3、收发数据,用函数send()和recv(),或者read()和write();

4、关闭网络连接;

#include 

5 测试

1、使用gcc 分别编译源文件(gcc -o 可直接输出可执行文件)

7536617de4b68572fee1a558b631f46d.png

45f9765ee408a54881ed94ee4e4f5d37.png

2、运行server

b0bf225277f7d61a564f8e42d5017327.png

3、3次运行client

3a6c283cb2c40666d931d7e9a39f6f4a.png

e67c688aaf9bbd3052221b32b837478e.png

6 总结

本文只实现了客户端的单向发送功能,没有实现接收功能。另外服务端也只对单个连接进行处理,但是,服务器应该具备高并发,处理大量socket连接的能力。一般可通过多线程以及I/O复用(select,poll,epoll)的方法来实现高并发。