send()函数的用法;MSG_NOSIGNAL什么含义?有什么作用?以及flags中参数类型有哪些各自又起到什么作用?

本文介绍了send()函数的基本用法,包括其参数含义和在TCP/IP网络编程中的应用。重点讨论了MSG_NOSIGNAL标志的作用,即防止因发送数据到已关闭连接而产生的SIGPIPE信号。此外,还列举了send()函数flags参数中的其他常见选项,如MSG_DONTWAIT和MSG_MORE等,及其在网络通信中的影响。
摘要由CSDN通过智能技术生成

目录

 1.send()函数的基本用法(入门级):

2.MSG_NOSIGNAL什么含义?有什么作用?

3.send()函数中第4个flags中参数类型有哪些各自又起到什么作用?


 1.send()函数的基本用法(入门级):

send() 函数是一个用于在 TCP/IP 网络上发送数据的系统调用函数。它通常在客户端和服务器端程序中被使用。

send() 函数的语法如下:

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

其中,sockfd 表示需要发送数据的 socket 文件描述符,buf 表示指向要发送数据的缓冲区的指针,len 表示要发送数据的长度,flags 是一个选项参数,它可以影响发送的行为。

send() 函数返回发送的字节数。如果出现错误,它会返回 -1。

下面是一个简单的例子,演示了如何使用 send() 函数发送数据:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define BUF_SIZE 1024

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Usage: %s <IP> <PORT>\n", argv[0]);
        exit(1);
    }
    char *ip = argv[1];
    int port = atoi(argv[2]);

    // 创建 socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket");
        exit(1);
    }

    // 连接服务器
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    if (inet_pton(AF_INET, ip, &server_addr.sin_addr) <= 0) {
        perror("inet_pton");
        exit(1);
    }
    if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
        perror("connect");
        exit(1);
    }

    // 发送数据
    char buf[BUF_SIZE];
    sprintf(buf, "Hello, server!");
    int send_len = strlen(buf);
    int send_sum = 0;
    while (send_sum < send_len) {
        int n = send(sockfd, buf + send_sum, send_len - send_sum, 0);
        if (n < 0) {
            perror("send");
            exit(1);
        }
        send_sum += n;
    }
    printf("Send data: %s\n", buf);

    // 关闭连接
    close(sockfd);
    return 0;
}

在这个例子中,程序首先创建了一个 socket,然后使用 connect() 函数连接到服务器。之后,程序使用 send() 函数发送数据,发送完毕后,关闭连接。

注意,在实际使用 send() 函数时,还需要考虑数据发送失败的情况,以及需要发送的数据可能过大需要分包的情况。因此,在编写网络编程时,需要对发送和接收数据的过程进行充分的考虑和测试,以确保程序的正确性和稳定性。

2.MSG_NOSIGNAL什么含义?有什么作用?

MSG_NOSIGNAL 是一个常量,它是在发送数据时的一个 flag 参数。它的作用是禁止在发送数据时产生 SIGPIPE 信号。

当使用 TCP 连接进行数据传输时,如果在连接已关闭的情况下尝试发送数据,操作系统会向发送进程发送一个 SIGPIPE 信号。默认情况下,如果进程没有捕获该信号或忽略该信号,进程就会被操作系统终止。

使用 MSG_NOSIGNAL 标志可以防止在连接已关闭的情况下产生 SIGPIPE 信号,而是使 send() 函数在发送数据时返回一个错误码,以提示应用程序数据发送失败。

在多线程或多进程的应用程序中,禁止 SIGPIPE 信号可以有效地避免由于一个线程或进程因为未处理 SIGPIPE 信号而导致整个程序被终止的问题。

总之,使用 MSG_NOSIGNAL 标志可以防止由于信号处理不当而导致进程异常终止,增加程序的稳定性和可靠性。

3.send()函数中第4个flags中参数类型有哪些各自又起到什么作用?

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

send() 函数的 flags 参数用于指定发送数据的选项。它是一个整型变量,可以使用逻辑 OR 运算符 (|) 来设置多个选项。下面列出了一些常见的选项及其含义:

  • MSG_NOSIGNAL:在发送数据时,如果对方已经关闭了连接,则忽略 SIGPIPE 信号,避免程序终止。如果不设置此选项,则默认会在发送数据时检查连接状态,如果连接已关闭则会发送 SIGPIPE 信号导致程序终止。
  • MSG_DONTWAIT:设置为非阻塞模式,即在发送数据时不会阻塞等待,而是立即返回,即使发送缓冲区已满。如果发送缓冲区已满,则会返回 EAGAIN 或 EWOULDBLOCK 错误。
  • MSG_MORE:表示还有更多的数据需要发送,可以用于拼接数据包,减少发送的次数。对于 TCP 连接,会将数据放到 TCP 的发送缓冲区中等待,直到发送缓冲区中的数据被成功发送或者出现错误。
  • MSG_CONFIRM:仅用于 SOCK_DGRAM 套接字类型,表示数据包需要得到确认,确保数据包成功发送。如果不设置此选项,则数据包不需要得到确认,可能会丢失或重复发送。
  • MSG_WAITALL:在接收数据时,如果数据长度小于请求的长度,则一直等待直到接收到请求长度的数据或者出现错误。如果不设置此选项,则可能会返回部分数据或者 EAGAIN 或 EWOULDBLOCK 错误。

除了上述选项外,还有一些其他选项,如 MSG_OOB(发送带外数据)等,具体可以参考系统文档。需要注意的是,不同的操作系统可能支持不同的选项,因此在编写跨平台程序时需要特别注意。

笔记记录分享,欢迎共同进步,随手一赞是对我最大的支持;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值