Linux下编写UDP/TCP版本的服务器和客户端的流程

Linux下编写UDP/TCP版本的服务器和客户端的流程

一:UDP和TCP的区别

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,通常情况下是无差错,不丢失,不重复,且按序到达的,(注意,这里的可靠是在通常情况下,在非通常情况下,TCP传送数据并不是不是100%,比如把网线拔了,数据就无法到达,所以TCP的可靠指发送数据后,会收到有一个确认的信号);UDP尽最大努力交付,即不保 证可靠交付,也就是得不到具体的回复,不知道数据是否到达或者没有到达。

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

二、UDP编写服务器的步骤:
1、创建一个socket,用函数socket();

int socket(int domain, int type, int protocol);

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

int bind(int socket, const struct sockaddr *address,
              socklen_t address_len);

3、循环接收数据,用函数recvfrom();

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

4.把服务器处理的数据发送给客户端sendto()

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

5、关闭网络连接,断开链接;
三、UDP编写客户端的步骤:
1、创建一个socket,用函数socket();

int socket(int domain, int type, int protocol);

2、客户端一般不需要bind(),让操作系统内核随机分配一个端口号给客户端使用,因为在通常情况下,一个端口只能被一个进程bind(),此时如果客户端bind(),并且如果有其他客户端同样bind()到同一个端口号,就会出错。

3、发送数据,用函数sendto();

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

4、接收服务器端发送回来的结果,recvfrom()

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

5、关闭网络连接;

四、TCP编写服务器的步骤:
1、创建一个socket,用函数socket();

int socket(int domain, int type, int protocol);

2、设置socket属性,用函数setsockopt(); * 可选

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

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

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

int listen(int s, int backlog);

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

int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

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

int send(int s, const void *msg, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

7、关闭网络连接;

8、关闭监听;

五、TCP编写客户端的步骤:
1、创建一个socket,用函数socket();

int socket(int domain, int type, int protocol);

2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选

 int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

4、设置要连接的对方的IP地址和端口等属性;

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

 int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

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

int send(int s, const void *msg, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

7、关闭网络连接;

发布了49 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/wolfGuiDao/article/details/103544921