目录
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(发送带外数据)等,具体可以参考系统文档。需要注意的是,不同的操作系统可能支持不同的选项,因此在编写跨平台程序时需要特别注意。
文章来源:https://www.toymoban.com/news/detail-729195.html
笔记记录分享,欢迎共同进步,随手一赞是对我最大的支持;文章来源地址https://www.toymoban.com/news/detail-729195.html
到了这里,关于send()函数的用法;MSG_NOSIGNAL什么含义?有什么作用?以及flags中参数类型有哪些各自又起到什么作用?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!