首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux C语言高级编程之使用TCP和UDP协议实现网络通信!

使用TCP和UDP协议实现网络通信

基于tcp协议的通信过程及相关函数

服务端:

1)创建socket,使用socket函数;

2)准备通信地址,使用结构体;

3)绑定socket和通信地址,使用bind函数;

4)设置监听,使用listen函数;

5)响应客户端的连接请求,使用accept函数;

6)进行通信,使用read/write或者recv和send函数;

7)关闭socket,使用close函数;

客户端:

1)创建socket,使用socket函数;

2)准备通信地址,使用服务器的地址;

3)连接socket和通信地址,使用connect函数;

4)进行通信,使用read/write或者recv和send函数;

5)关闭socket,使用close函数;

基于tcp协议通信相关函数

1、listen函数:让一个套接字处于监听到来的连接请求的状态

函数原型:

#include

#include

int listen(int sockfd, int backlog);

参数解析:

1)socket描述符,socket函数的返回值;

2)指定等待被连接队列的最大数量;

返回值:如无错误发生,listen()返回0。否则的话,返回-1。

功能:主要用于将参数sockfd所关联的socket标记为消极的socket,也就是专门用于响应客户端连接请求的socket。listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。

2、accept函数:响应客户端的连接请求

函数原型:

#include

#include

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

参数解析:

1)socket描述符,socket函数的返回值

2)结构体指针,用于带出客户端的通信地址

3)整数指针,用于带出客户端通信地址的大小

返回值:成功返回新创建的socket描述符,失败返回-1;

功能:主要用于响应客户端的连接请求,该函数会提取sockfd接待的连接请求队列中的第一个请求进行响应,响应的方式为再创建一个新的socket进行通信,该socket不再处于监听的状态。

注意:socket函数返回的描述符 - 主要用于绑定、监听以及响应;accept函数返回的描述符 - 主要用于进行通信。

tcp协议和udp协议的比较

1、tcp协议的概念及特性:

tcp协议:传输控制协议,面向连接的协议,类似打电话:建立连接、 进行通信、断开连接。

tcp协议特性:

1)在通信的整个过程中全程保持连接;

2)保证了数据传输的可靠性和有序性;

3)提供了流量控制,可以避免数据接收方因为接收到的数据过多而造成缓冲区的溢出问题;

4)提供了一种全双工的字节流通信方式,记录没有边界;

5)服务器压力比较大,资源消耗比较高,执行效率比较低。

2、udp协议的概念及特性:

udp协议:用户数据报协议,非面向连接协议,类似发短信。

udp协议的特性:

1)不需要在整个通信的过程中全程保持连接;

2)不保证数据传输的可靠性和有序性;

3)不提供流量的控制,可能会造成缓冲区的溢出;

4)提供了一种全双工的数据报通信方式,记录有边界;

5)服务器压力比较小,资源消耗比较低,执行效率比较高。

基于udp协议的通信过程及相关函数

服务端:

1)创建socket,使用socket函数;

2)准备通信地址,使用结构体类型;

3)绑定socket和通信地址,使用bind函数;

4)进行通信,使用send/sendto/recv/recvfrom函数;

5)关闭socket,使用close函数。

客户端:

1)创建socket,使用socket函数;

2)准备通信地址,使用服务器的地址;

3)进行通信,使用send/sendto/recv/recvfrom函数;

4)关闭socket,使用close函数。

基于udp协议通信相关函数

1、send/sendto函数:将指定的消息发送到指定的位置

函数原型:

#include

#include

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

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

参数解析:

1)socket描述符,socket函数的返回值;

2)缓冲区的首地址,被发送数据的首地址;

3)被发送数据的大小;

4)发送的方式,默认给0即可;

5)收件人的通信地址信息;

6)收件人的通信地址大小;

返回值:成功返回实际发送的数据大小,失败返回-1;

功能:用于将指定的消息发送到指定的位置;

2、recv/recvfrom函数:接收指定的消息并记录发送方通信地址

函数原型:

#include

#include

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

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

参数解析:

1)socket描述符,socket函数的返回值;

2)缓冲区的首地址(存储到哪里去);

3)接收的数据大小;

4)接收的标志,默认给0即可;

5)记录数据发送方的通信地址;

6)数据发送方通信地址的大小;

返回值:成功返回实际接收的数据大小,失败返回-1。

功能:用于接收指定的消息并记录发送方通信地址。

注意:在实际的项目中一般使用send和recv函数进行通信,而很少之前的read和write。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171214G02Y6B00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券