用于无连接套接字的读写函数情况要复杂一点。由于没有建立一个连接,所以每次发送数据的过程中都要明确指明该数据包的地址,同时,在接收数据包的时候,接受进程能够得到发送该数据包的地址,从而知道该数据包从哪里来。
Linux环境中提供有专门对无连接的套接字进行读写的函数,这两个函数分别为sendto函数和recvfrom函数,函数原型如下:
int sendto(int sockfd, const *restrict buf, size_t len, int flags, struct sockaddr * restrict destaddr, socket_len *restrict destlen);
头文件: #include <sys/types.h> #include <sys/socket.h>
参数说明:
第一个参数sockfd表示通信用的套接字。
第二个参数buf表示发送内容所在的缓冲区。
第三个参数len表示需要发送的字节数。
第四个参数flags是传输标志位,一般设0,详细描述请参考send()。
第五个参数destaddr是一个sockaddr地址结构的地址,该地址表示数据报的目的地,结构sockaddr 请参考bind。
第六个参数destlen表示数据报目的地址结构大小。
返回值:成功返回实际传送出去的字符数,失败返回-1。
int recvfrom (int sockfd, const *restrict buf, size_t len, int flags, struct sockaddr * restrict addr, socket_len *restrict addrlen);
头文件: #include <sys/types.h> #include <sys/socket.h>
参数说明:
第一个参数sockfd表示通信用的套接字。
第二个参数buf表示存储接收数据的缓冲区。
第三个参数len表示需要接收的字节数。
第四个参数flags是传输标志位。
第五个参数addr是一个sockaddr地址结构的地址,该地址表示数据报的发送地址。
第六个参数addrlen表示数据报目的地址结构大小。
无连接的数据传说一般使用的是UDP协议,还是使用大小写字母转换的例子来演示无连接服务的服务器端程序。无连接服务器端执行流程如下:
服务器端程序代码如下所示:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <ctype.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <errno.h> #define MAX_LINE 100 /*处理函数,将大写字符转换成小写字符。参数为需要转换的字符串*/ void my_fun(char *p) { if(p == NULL) return ; for(; *p != '