- 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/
iam 尝试使用 sendmsg、recvmsg 函数在两个进程之间传递文件描述符.. 我通过在unix域中创建套接字来做到这一点。 当我执行它时,我收到了recvmsg的操作不支持错误,它与send
我正在使用 recvmsg 和 sendmsg 通过异步 STREAM 套接字发送数据。要传输的数据量相当大,在 15 MB 到 30 MB 之间。 我不明白为什么数据到达时损坏了。发送消息和接收函数
我有套接字系列 PF_PACKET 类型 SOCK_RAW。通过 recvmsg 和 poll() 读取消息。我随机地和定期地收到 recvmsg 返回 EDEADLK。我尝试用下一个代码调试这个问题
本文整理了Java中org.zeromq.ZMsg.recvMsg()方法的一些代码示例,展示了ZMsg.recvMsg()的具体用法。这些代码示例主要来源于Github/Stackoverflow/
自 recvmsg()在 asyncio 中丢失模块,我试图以与 BaseEventLoop.sock_recv() 完全相同的方式重新实现它已实现: import asyncio, socket d
我正在Linux中打开RAW套接字并读取所有消息。 recvmsg(mysock, &msg, 0); 我遍历该msg缓冲区上的所有cmsg,但只有一个。 for (c = CMSG_FIRS
如果C套接字的recvmsg()具有队列,我如何找出队列中积压了多少项? 我的问题是,从recvmsg()接收到某些内容后,代码的速度有时会比发送到recvmsg()的数据速率慢,这在逻辑上会导致排队
我在接收 UDP 数据包时遇到问题。我的环境在 ARMv7 上运行 Android 2.1。对于 C 套接字编程,我使用 recvmsg 从内核接收数据包,但偶尔会出现一些数据包丢失事件。发送方和接收
我正在开发一个在两个进程之间进行IPC调用的程序。我使用socketpair创建两个套接字fd: int fds[2] = {-1,-1}; if (socketpair(AF_LOCAL, SOCK
在这个问题上有点困惑 :-)。我有一些代码在 Ubuntu 10.04 上运行,它使用 recvmsg 调用来接收音频 UDP 数据包。这部分是一个更大的 SIP 客户端的一部分,我一直在通过网络使用
我正在编写一个程序,使用 sendmsg 在两个进程之间传递文件描述符和 recvmsg通过域套接字。对于发送文件描述符,附加数据包含在 msghdr.msg_iov 中和 msghdr.msg_io
我有一个使用 pthreads 的小 Unix 守护进程。一个线程循环运行,使用 recvmsg 读取网络数据包。当守护进程收到信号时,会设置一个标志,告诉所有线程跳出循环并退出。然而,“监听”线程从
我正在编写一个 CAN 记录器程序。我记录数据的方式类似于 candump -tool 在调用 candump 时执行此操作喜欢 candump any : https://github.com/li
我正在使用 Linux 机器,并且正在发送 UDP 数据包。 我想为传输的数据包获取 NIC 上的硬件时间戳。我看过其他帖子并设置了适当的标志。 int flag = SOF_TIMESTAMPING
在unix系统上使用TCP套接字,python似乎完全忽略了我的ancbufsize。 data, ancdata, msg_flags, address = sock.recvmsg(1, sock
我必须使用 recvfrom() 从多个接口(interface)接收(在编译时未知,并且还需要保留消息的确切顺序,而不是使用单独的系统调用从每个接口(interface)接收反过来),但我还需要访问
我在 Linux 中有一个使用 C 的应用程序,其中我创建了一个套接字来接收 IPv6 UDP 数据包。 为了接收数据包,我使用了 recvmsg(),因为我需要检索 ifindex,我可以使用选项
在使用 recvmsg 时,我使用 MSG_TRUNC 和 MSG_PEEK,如下所示: msgLen = recvmsg(fd, &hdr, MSG_PEEK | MSG_TRUNC) 这给出了为下
我正在使用 UDP 的 Haskell 中编写一个隧道应用程序。为了让它“正确”,我想适本地设置 MTU。但是,我找不到任何简单的方法来做到这一点。 haskell 中是否有一个 recvmsg()
我在 CentOS 6.5 上,内核版本为 kernel-2.6.32-431.el6。 我试图找到 recvmmsg() 的实现,希望我没有看错源代码 ~/rpmbuild/BUILD/kernel
我是一名优秀的程序员,十分优秀!