- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个非常简单且基本的STCP一对多服务器以进行测试,但是由于某种原因,套接字似乎只能接收一条消息。收到一条消息后,对recvmsg
的每个后续调用均返回-1,且errno
为EFAULT
。这对我来说绝对没有意义,所以也许您可以告诉我我在这里没看到的内容。 EFAULT
应该在以下情况下返回
EFAULT
The receive buffer pointer(s) point outside the process's address space.
#include <ctype.h>
#include <cstring>
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, char** argv) {
struct sockaddr_in bind_address;
bind_address.sin_family = AF_INET;
bind_address.sin_port = htons(51338);
bind_address.sin_addr.s_addr = INADDR_ANY;
int sock = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
if (sock == -1) {
perror("Error while creating socket");
return 1;
}
int rv = bind(sock, (struct sockaddr*)(&bind_address), sizeof(bind_address));
if (rv != 0 ) {
perror("Error while binding socket");
return 1;
}
rv = listen(sock, 1);
if (rv != 0 ) {
perror("Error while listening");
return 1;
}
struct iovec iov[1];
iov[0].iov_base = malloc(1500);
iov[0].iov_len = 1500;
struct sockaddr_in sin = {};
char control[1000] = { 0 };
struct msghdr mhdr;
mhdr.msg_iov = iov;
mhdr.msg_iovlen = sizeof(iov);
mhdr.msg_name = &sin;
mhdr.msg_namelen = sizeof(sin);
mhdr.msg_control = &control;
mhdr.msg_controllen = sizeof(control);
while (true) {
std::memset(iov[0].iov_base, 0, iov[0].iov_len);
std::memset(&sin, 0, sizeof(sin));
int recv_bytes = recvmsg(sock, &mhdr, 0);
if (recv_bytes == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
continue;
} else {
perror("Err");
}
break;
}
std::cout << "Received message: " << std::endl;
std::cout << (char*)iov[0].iov_base << std::endl;
}
return 0;
}
最佳答案
该错误最有可能是因为第一次调用recvmsg()
会覆盖堆栈上的某些数据,从而导致mhdr
内部的一个指针无效。这可能是因为以下这一行:
mhdr.msg_iovlen = sizeof(iov);
它不应包含
iov
数组的大小(以字节为单位),而应包含该数组中元素的数量,因此:
mhdr.msg_iovlen = sizeof(iov) / sizeof(*iov); // which equals 1 in this case
关于c++ - SCTP recvmsg返回EFAULT(错误地址),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64282046/
我正在运行以下 C 代码,尝试读取缓冲区中的内容分配在调用者的堆栈上,但失败并出现 errno 14(错误地址)。 #include #include #include #include #i
我有一个在多台机器上运行的套接字服务器。除了在一台机器上,它的工作就像一个魅力。 服务器正确绑定(bind)但在客户端尝试连接时返回错误 (EFAULT)。 也许有人知道问题的根源可能是什么。非常感谢
我试图通过检查它们的 inode 和设备 ID 是否匹配来比较两个文件名是否引用同一个文件。目前,我调用 vfs_stat 来获取 ID。 问题是,如果我向 vfs_stat 传递一个存储在用户空间的
我正在尝试使用 send 发送单个 1 字节值,但是当我尝试发送时它失败并将 errno 设置为 EFAULT。我不确定为什么会这样,因为我将 buf 参数设置为 char 的地址。 #include
我试图了解 clock_gettime() 何时会导致错误。手册页列出了以下两种可能性: EFAULT tp 指向可访问地址空间之外。 EINVAL 此系统不支持指定的 clk_id。 很容易触发 E
需要明确的是,这是一个设计问题而不是实现问题 我想知道 POSIX 这样做的背后原因。 POSIX 系统调用在给定无效内存位置时返回 EFAULT 而不是使用户空间程序崩溃(通过发送 sigsegv)
我正在编写一个 UDP 非阻塞套接字并且我有这个功能 void recvflush(int sockfd) { ssize_t num; while (errno != EWOULDBLOCK
我正在尝试创建一个在一个文件中运行 exec 的分支,然后等待它完成。如果子进程中的 exec 被信号终止,我想打印信号,如果程序运行时间太长,我想打印超时。 pid_t pid;
我正在编写一个程序,当从两个单独的 bash session 作为两个单独的进程运行时,打开两者之间的命名管道以允许字符串从一个发送到另一个。 当进程第一次从一个终端执行时,它会检查 stat(fna
我正在使用系统调用实现 mmap 函数。(由于某些原因,我正在手动实现 mmap。) 但是我得到的返回值是 -14(-EFAULT,我用 GDB 核实过)这条消息: WARN Nar::Mmap:
我有文件描述符并且想获得真实路径。目前我调用 sys_readlink /proc/self/fd/有时有效,但我经常收到错误 -14 (-EFAULT)。 这里是一些代码: fs = get_fs(
我在内核模块中创建了 block 设备。当一些 I/O 发生时,我从另一个现有设备读取/写入所有数据(比如说 /dev/sdb )。 它打开正常,但读/写操作返回 14 错误(EFAULT,错误地址)
我在嵌入式应用程序中遇到了一些 readdir() 问题,因此我在应用程序代码的方便位置添加了这个自包含测试: FILE *f; DIR *d; f = fopen ("/mnt/mydir/myfi
我有一个非常简单的问题,但整个周末我都没有设法找到任何答案。我正在使用 sendto() 函数,它返回错误代码 14:EFAULT。手册页将其描述为: "An invalid user space a
我正在将 mprotect 调用注入(inject)跟踪进程: static int inject_mprotect(pid_t child, void *addr, size_t len, int
我正在构建一个小型 linux shell 并尝试实现 > 运算符以将命令的输出重定向到一个文件。 我遇到的问题是,当我尝试运行类似 ls > test.txt 的程序时,我收到了一个Bad Addr
freopen 返回 errno 14:相当于 EFAULT - BAD ADDRESS在 Ubuntu 上交叉编译。在基于 arm 的 android 设备上执行内核 3.0.23 性能 ELF
我在汇编中使用手动系统调用。我之前能够使其正常启动,但在删除空值后,我无法让系统调用执行 /bin/date .这是我用 AT&T 语法编写的代码。 .global main main: jm
我最近决定试一试 x86-64 汇编。我在显示 argv 时遇到了问题 是的,我写的代码很糟糕,它会做出假设并且不会检查错误,我知道,但我真的不认为这是这个问题的原因。 这是我的程序的核心。
更新:用 valgrind 运行 git diff 结果 Syscall param execve(argv) points to uninitialised byte(s) strace 的输出未
我是一名优秀的程序员,十分优秀!