使用socket实现简单客户端和服务端的通信(基于UDP)

本文介绍了如何使用UDP协议实现简单的客户端和服务端通信。通过sendto和recvfrom函数,无需预先建立连接,直接收发数据。文章提供了一个服务端和客户端的C语言代码示例,展示了UDP通信的基本流程。
摘要由CSDN通过智能技术生成

1. 使用udp协议通信
在此之前,我们基于TCP的客户端/服务端通信示例是有连接方式的,客户端会先调用connect发起连接,当两端tcp连接建立完成,然后服务端调用accept接受客户端的连接,通过套接字开始通信。

UDP协议是无连接不可靠的,没有被动套接字和主动套接字之分,客户端和服务端之间通信不需要提前建立好连接,而是直接调用sendto或recvfrom函数收发数据,如下图所示:

 

2.sendto和recvfrom函数介绍


sendto(经socket传送数据)

相关函数
send , sendmsg,recv , recvfrom , socket
表头文件
#include < sys/types.h >
#include < sys/socket.h >
定义函数
int sendto ( int s , const void * msg, int len, unsigned int flags, const
struct sockaddr * to , int tolen ) ;
函数说明
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结果长度。
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。
错误代码
EBADF 参数s非法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间。
WNOTSOCK canshu s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。
ENOBUFS 系统的缓冲内存不足。
EINVAL 传给系统调用的参数不正确。
 

 

recvfrom

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较广泛的问题,我会尽量给您介绍一下Socket编程的基本知识和一些示例代码。首先,Socket编程可以用于实现不同机器或者同一机器上的进程间通信,TCP和UDP是两种经常使用的协议。下面我为您介绍一下TCP和UDP通信流程和一些基本的代码示例。 ## 基本概念 ### TCP TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。TCP在传输数据前需要先建立连接,而且必须保证传输的数据是可靠的,因此TCP通信相对来说比较安全可靠,但是由于需要建立连接和维护状态信息,因此TCP的效率相对较低。 ### UDP UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的传输协议,它不需要建立连接,只需要发送数据报即可。由于UDP不需要维护连接状态,因此效率比TCP高,但是由于它不保证数据传输的可靠性,因此在需要可靠性较高的场景下不太适合使用。 ### Socket Socket(套接字)是应用层与传输层之间的一个接口,它包含了IP地址和端口号,可以用于实现进程间的通信。在Socket编程中,我们通常使用TCP或UDP协议进行通信。 ## TCP通信示例 ### 服务端 以下是一个使用TCP协议实现服务端示例代码,它接收客户端发送的数据并将其打印出来: ```python import socket HOST = '' # 监听所有可用的接口 PORT = 8888 # 监听的端口号 # 创建socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print('Socket created') # 绑定socket对象到本地IP和端口号 try: s.bind((HOST, PORT)) except socket.error as msg: print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]) sys.exit() print('Socket bind complete') # 开始监听客户端连接请求 s.listen(10) print('Socket now listening') # 等待客户端连接 conn, addr = s.accept() print('Connected with ' + addr[0] + ':' + str(addr[1])) # 接收客户端发送的数据并打印出来 while True: data = conn.recv(1024) if not data: break conn.sendall(data) print(data.decode('utf-8')) # 关闭socket对象 conn.close() s.close() ``` ### 客户端 以下是一个使用TCP协议实现客户端示例代码,它向服务端发送数据并接收服务端返回的数据: ```python import socket HOST = '127.0.0.1' # 服务端的IP地址或主机名 PORT = 8888 # 服务端的端口号 # 创建socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print('Socket created') # 连接服务端 s.connect((HOST, PORT)) print('Socket connected to ' + HOST + ' on port ' + str(PORT)) # 发送数据到服务端 s.sendall(b'Hello, world') # 接收服务端返回的数据并打印出来 data = s.recv(1024) print(data.decode('utf-8')) # 关闭socket对象 s.close() ``` ## UDP通信示例 ### 服务端 以下是一个使用UDP协议实现服务端示例代码,它接收客户端发送的数据并将其打印出来: ```python import socket HOST = '' # 监听所有可用的接口 PORT = 8888 # 监听的端口号 # 创建socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) print('Socket created') # 绑定socket对象到本地IP和端口号 s.bind((HOST, PORT)) print('Socket bind complete') # 接收客户端发送的数据并打印出来 while True: data, addr = s.recvfrom(1024) print(data.decode('utf-8')) # 关闭socket对象 s.close() ``` ### 客户端 以下是一个使用UDP协议实现客户端示例代码,它向服务端发送数据: ```python import socket HOST = '127.0.0.1' # 服务端的IP地址或主机名 PORT = 8888 # 服务端的端口号 # 创建socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) print('Socket created') # 发送数据到服务端 s.sendto(b'Hello, world', (HOST, PORT)) # 关闭socket对象 s.close() ``` 以上就是一个基本的Socket编程示例,如果您还有什么问题可以继续问我哦。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值