标签搜索

目 录CONTENT

文章目录

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

小小城
2021-08-22 / 0 评论 / 0 点赞 / 6 阅读 / 2,194 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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

@[toc]

一: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、设置要连接的对方的IP地址和端口等属性;

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

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

  • 4、收发数据,用函数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);
  • 5、关闭网络连接;
0

评论区