之前章节中数据IO使用的是writeread函数,本章节将介绍其他几种IO函数,并说明其优点。

13.1 send & recv 函数

13.1.1 Linux 中的 send & recv

  1. #include <sys/socket.h>
  2. ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
  3. /*
  4. sockfd: 表示与数据传输对象的连接的套接字和文件描述符
  5. buf: 保存带传输数据的缓冲地址值
  6. nbytes: 待传输字节数
  7. flags: 传输数据时指定的可选项信息
  8. 成功时返回发送的字节数,失败时返回 -1
  9. */
  1. #include <sys/socket.h>
  2. ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);
  3. /*
  4. sockfd: 表示数据接受对象的连接的套接字文件描述符
  5. buf: 保存接受数据的缓冲地址值
  6. nbytes: 可接收的最大字节数
  7. flags: 接收数据时指定的可选项参数
  8. 成功时返回接收的字节数(收到 EOF 返回 0),失败时返回 -1
  9. */

send 和 recv 函数都是最后一个参数是收发数据的可选项,该选项可以用|运算符同时传递多个信息。

image.png

13.1.2 MSG_OOB:发送紧急消息

MSG_OOB 可选项用于创建特殊发送方法和通道以发送紧急消息。下面为 MSG_OOB 的示例代码:

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/socket.h>
  6. #include <arpa/inet.h>
  7. #define BUF_SIZE 30
  8. void error_handling(char *message);
  9. int main(int argc, char *argv[]){
  10. int sock;
  11. struct sockaddr_in recv_adr;
  12. if (argc != 3){
  13. printf("Usage : %s <IP> <port>\n", argv[0]);
  14. exit(1);
  15. }
  16. sock = socket(PF_INET, SOCK_STREAM, 0);
  17. memset(&recv_adr, 0, sizeof(recv_adr));
  18. recv_adr.sin_family = AF_INET;
  19. recv_adr.sin_addr.s_addr = inet_addr(argv[1]);
  20. recv_adr.sin_port = htons(atoi(argv[2]));
  21. if (connect(sock, (struct sockaddr *)&recv_adr, sizeof(recv_adr)) == -1)
  22. error_handling("connect() error");
  23. write(sock, "123", strlen("123"));
  24. send(sock, "4", strlen("4"), MSG_OOB);
  25. write(sock, "567", strlen("567"));
  26. send(sock, "890", strlen("890"), MSG_OOB);
  27. close(sock);
  28. return 0;
  29. }
  30. void error_handling(char *message){
  31. fputs(message, stderr);
  32. fputc('\n', stderr);
  33. exit(1);
  34. }

// 暂时看到这,感觉后面的章节都是用标准IO函数了,等有需要再来看13、14章。