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

这篇具有很好参考价值的文章主要介绍了send()函数的用法;MSG_NOSIGNAL什么含义?有什么作用?以及flags中参数类型有哪些各自又起到什么作用?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 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(发送带外数据)等,具体可以参考系统文档。需要注意的是,不同的操作系统可能支持不同的选项,因此在编写跨平台程序时需要特别注意。

msg_nosignal,C/C++知识点记录,tcp/ip,开发语言,c语言,网络

笔记记录分享,欢迎共同进步,随手一赞是对我最大的支持;文章来源地址https://www.toymoban.com/news/detail-729195.html

到了这里,关于send()函数的用法;MSG_NOSIGNAL什么含义?有什么作用?以及flags中参数类型有哪些各自又起到什么作用?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • memcmp函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    memcmp()函数用于:比较两个内存块 函数声明:int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 参数: ptr1:指向内存块的指针。 ptr2:指向内存块的指针。 数字:要比较的字节数。 返回值: 0: 在两个内存块中不匹配的第一个字节在  ptr1  中的值低于 在 ptr2  中的值(如果计

    2023年04月09日
    浏览(61)
  • strstr函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

     strstr()函数用于:查找子字符串 目录 函数介绍 用法示例 函数讲解 实现函数  事例展示 函数声明:char *strstr(const char *str1, const char *str2) 头  文  件:#include string.h 返  回  值: 返回值为char * 类型( 返回指向  str1  中第一次出现的  str2  的指针);如果  str2  不是 

    2024年02月13日
    浏览(45)
  • isNan() 函数有什么作用?

    isNaN() 函数用于确定一个值是否为 “NaN”(非数字)。它接受一个参数,并尝试将该参数转换为数字类型。如果参数不能转换为数字,或者转换结果是 “NaN”,则函数返回 true;否则,返回 false。 NaN(Not-a-Number)是一个特殊的 JavaScript 值,表示一个不是有效数字的结果。当进

    2024年02月07日
    浏览(31)
  • CSS中的calc()函数有什么作用?

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月12日
    浏览(39)
  • Solidity中this、msg、block、tx、gas的用法

    目录 前言 1.this 2.msg 3.block 4.tx 5.gas 总结 在智能合约编程中,全局变量扮演着关键的角色,提供了访问外部信息和交易上下文的重要途径。本文将重点介绍 Solidity 中的五个重要全局变量: this 、 msg 、 block 、 tx 和 gas ,以及它们在智能合约中的用法和作用。通过深入了解这些

    2024年04月09日
    浏览(46)
  • 析构函数的用法是什么?

    动态内存管理 析构函数常用于释放通过动态内存分配(如 new )获得的资源,以防止内存泄漏。 文件操作 析构函数可以用于在对象生命周期结束时关闭文件,确保文件资源被正确释放。 资源管理 析构函数还可以用于释放其他类型的资源,如数据库连接、网络连接等。

    2024年02月13日
    浏览(32)
  • 混淆矩阵含义及作用

    在机器学习领域, 混淆矩阵(Confusion Matrix) ,又称为可能性矩阵或错误矩阵。混淆矩阵是可视化工具,特别用于监督学习,在 无监督学习 一般叫做 匹配矩阵 。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面 混淆

    2024年02月05日
    浏览(33)
  • C++中的多态是什么?如何实现多态?解释一下C++中的虚函数和纯虚函数,它们的作用是什么?

    C++中的多态是什么?如何实现多态? 在C++中,多态(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装(Encapsulation)和继承(Inheritance)。多态指的是允许一个接口(或一个父类引用)在多种数据类型上被实现,或者一个接口被多个不同的类以不同的方式实现。

    2024年02月19日
    浏览(56)
  • 【Flutter 面试题】main()和runApp()函数在Flutter的作用分别是什么?有什么关系吗?

    【Flutter 面试题】main()和runApp()函数在Flutter的作用分别是什么?有什么关系吗? 关于我 , 小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。 👏🏻 正在学 Flutter 的同学,你好! 😊 Flutter 面试宝典 是解决 Flutter 面试过程中

    2024年03月22日
    浏览(38)
  • solidity-msg.sender到底是什么?

    msg.sender: 当前钱包的发起方。 msg是全局的,msg.sender是全局变量。 from 就是 account ,发起消息的钱包地址, 永远等于msg.sender 测试代码: 部署Test合约(地址5b…)去测试那些属性和函数返回值,切换到另一个account(4b…),再测试那些属性和函数返回值。 运行结果: 切换

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包