之前章节中数据IO使用的是write和read函数,本章节将介绍其他几种IO函数,并说明其优点。
13.1 send & recv 函数
13.1.1 Linux 中的 send & recv
#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);/*sockfd: 表示与数据传输对象的连接的套接字和文件描述符buf: 保存带传输数据的缓冲地址值nbytes: 待传输字节数flags: 传输数据时指定的可选项信息成功时返回发送的字节数,失败时返回 -1*/
#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);/*sockfd: 表示数据接受对象的连接的套接字文件描述符buf: 保存接受数据的缓冲地址值nbytes: 可接收的最大字节数flags: 接收数据时指定的可选项参数成功时返回接收的字节数(收到 EOF 返回 0),失败时返回 -1*/
send 和 recv 函数都是最后一个参数是收发数据的可选项,该选项可以用|运算符同时传递多个信息。
13.1.2 MSG_OOB:发送紧急消息
MSG_OOB 可选项用于创建特殊发送方法和通道以发送紧急消息。下面为 MSG_OOB 的示例代码:
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#define BUF_SIZE 30void error_handling(char *message);int main(int argc, char *argv[]){int sock;struct sockaddr_in recv_adr;if (argc != 3){printf("Usage : %s <IP> <port>\n", argv[0]);exit(1);}sock = socket(PF_INET, SOCK_STREAM, 0);memset(&recv_adr, 0, sizeof(recv_adr));recv_adr.sin_family = AF_INET;recv_adr.sin_addr.s_addr = inet_addr(argv[1]);recv_adr.sin_port = htons(atoi(argv[2]));if (connect(sock, (struct sockaddr *)&recv_adr, sizeof(recv_adr)) == -1)error_handling("connect() error");write(sock, "123", strlen("123"));send(sock, "4", strlen("4"), MSG_OOB);write(sock, "567", strlen("567"));send(sock, "890", strlen("890"), MSG_OOB);close(sock);return 0;}void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);}
// 暂时看到这,感觉后面的章节都是用标准IO函数了,等有需要再来看13、14章。
