网络通信编程笔记(一):UDP编程(C语言)
来源:互联网 发布:js pagehide 编辑:程序博客网 时间:2024/06/05 05:30
深刻理解了:在使用TCP编写的应用程序与使用UDP编写的应用程序之间存在一些本质差异,其原因在于这两个传输层之间的差别:UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流协议。与面向连接的协议相比,面向无连接协议极为不同。其中一个重要的不同点就是客户端与服务器之间不必建立连接。对于UDP套接字编程而言,服务器创建套接字后,调用bind()函数将套接字与准备接收数据的接口绑定在一起。和TCP编程不同的是,应用程序不必调用listen()和accept()函数等待客户端的连接。而只需要等待接收数据了。开发UDP套接字应用程序,有两个重要的函数sendto()和recvfrom()。服务器采用recvfrom()来接收来自客户端的数据报,并获得客户端的端地址,之后向客户端发送数据时,采用sendto()函数。
消息发送函数sendto()
函数原型:
- #include <sys/socket.h>
- 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()
函数原型:
- #include <sys/socket.h>
- 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交替通信程序
注意:在数据报套接字编程模型中,客户端发送数据(也称发送端),服务器端接收数据(也称接收端)。实际上,由于数据报套接字编程模型也支持双向数据传递,因此,服务器端和客户端的概念已经比较模糊。UDP编程属于阻塞模式,只能实现双方交替通信,也就是说服务端收到客户端发送 的消息后要给客户端回发消息后客户端才能继续给服务端发送消息。反之亦然。
有意义的参考程序:1.UDP回射程序,2.UDP交替通信程序
0 0
- 网络通信编程笔记(一):UDP编程(C语言)
- 网络编程——UDP通信(c++)
- 网络编程UDP(一)
- 网络通信编程笔记(四):TCP通信(C语言)
- Linux C语言 网络编程(一)
- [Linux C编程]UDP网络通信
- 网络编程--UDP通信
- 网络编程-udp通信
- Python网络编程之socket编程(一)--使用TCP和UDP客户端和服务器通信
- 网络编程(一)UDP的使用
- Android网络编程TCP、UDP(一)
- Android网络编程TCP、UDP(一)
- UNIX网络编程笔记(6)—UDP网络编程
- 网络编程 笔记(一) 基于 Linux简单通信
- 网络编程(UDP)
- Qt c/C++ 混合编程,windows下的网络编程--udp封装(一)
- Udp网络编程(一)
- Java网络(Socket)编程小记一 UDP编程
- linux安装问题
- ios项目结构处理
- 微信小程序的原型设计尝鲜
- C#中如何判断两个对象是不是相等?
- Unity3D里foreach,using和Coroutine的GC问题探究及解决方案
- 网络通信编程笔记(一):UDP编程(C语言)
- Tomcat数据库连接池配置mysql的URL问题
- classpath路径
- 关于LeanCloud做注册功能时验证短信不能发出的设置方法
- 怎样实现多态?
- 将H264码流打包成RTP包
- Mapreduce理解
- struts.xml中,el表达式报错Invalid result location value/parameter
- C语言中的变量常量