网络通信编程笔记(一):UDP编程(C语言)

来源:互联网 发布:js pagehide 编辑:程序博客网 时间:2024/06/05 05:30

深刻理解了:在使用TCP编写的应用程序与使用UDP编写的应用程序之间存在一些本质差异,其原因在于这两个传输层之间的差别:UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流协议。与面向连接的协议相比,面向无连接协议极为不同。其中一个重要的不同点就是客户端与服务器之间不必建立连接。对于UDP套接字编程而言,服务器创建套接字后,调用bind()函数将套接字与准备接收数据的接口绑定在一起。和TCP编程不同的是,应用程序不必调用listen()和accept()函数等待客户端的连接。而只需要等待接收数据了。开发UDP套接字应用程序,有两个重要的函数sendto()和recvfrom()。服务器采用recvfrom()来接收来自客户端的数据报,并获得客户端的端地址,之后向客户端发送数据时,采用sendto()函数。

消息发送函数sendto()

函数原型:
  1. #include <sys/socket.h>  
  2. ssize_t sendto(int sockfd , const void *buf , size_t nbytes , int flags , const struct sockaddr *to , socklen_t addrlen);  
函数说明:
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数buf指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。
参数:
  • 前三个参数sockfd , buff 和 nbytes等同于read 和 write函数的三个参数:描述符、指向写出缓冲区的指针和写字节数;
  • falgs参数一般置0;
  • to参数指向一个含有数据报接收者的协议地址(如IP地址和端口号)的套接字地址结构,其大小由addrlen指定;
返回值:
若无错误发生,返回所发送数据的总数(请注意这个数字可能小于len中所规定的大小)。否则的话,返回SOCKET_ERROR错误(-1),应用程序可通过WSAGetLastError()获取相应错误代码。

消息接收函数recvfrom()

函数原型:

  1. #include <sys/socket.h>  
  2. ssize_t recvfrom(int sockfd , const void *buf , size_t nbytes , int flags , const struct sockaddr *from, socklen_t addrlen);   
函数说明:
recvfrom()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数nbytes为可接收数据的最大长度.参数,flags一般设0,其他数值定义参考recv(),参数from用来指定欲传送的网络地址,结构sockaddr请参考bind()函数,参数fromlen为sockaddr的结构长度。
参数说明:
  • 前三个参数sockfd , buff 和 nbytes等同于read 和 write函数的三个参数:描述符、指向写出缓冲区的指针和写字节数;
  • falgs参数一般置0;
  • from参数指向一个含有数据报接收者的协议地址(如IP地址和端口号)的套接字地址结构,其大小由addrlen指定;
返回值:
同sendto()函数!若无错误发生,返回所接收数据的总数(请注意这个数字可能小于len中所规定的大小)。否则的话,返回SOCKET_ERROR错误(-1),应用程序可通过WSAGetLastError()获取相应错误代码。

注意:在数据报套接字编程模型中,客户端发送数据(也称发送端),服务器端接收数据(也称接收端)。实际上,由于数据报套接字编程模型也支持双向数据传递,因此,服务器端和客户端的概念已经比较模糊。UDP编程属于阻塞模式,只能实现双方交替通信,也就是说服务端收到客户端发送 的消息后要给客户端回发消息后客户端才能继续给服务端发送消息。反之亦然。

有意义的参考程序:1.UDP回射程序,2.UDP交替通信程序


0 0
原创粉丝点击