- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 writev()/readv() 进行的客户端-服务器通信时遇到问题。
我有两个结构,header
和 data
定义如下:
typedef struct {
int op;
int key;
} message_hdr_t;
typedef struct {
int len;
char *data;
} message_data_t;
服务器(简而言之):
message_hdr_t h = {1, 11};
message_data_t d;
d.len = 3;
strcpy(d.data, "msg");
struct iovec tosend[2];
tosend[0].iov_base = &h;
tosend[0].iov_len = sizeof(message_hdr_t);
tosend[1].iov_base = &d;
tosend[1].iov_len = sizeof(message_data_t);
writev(socket, tosend, 2);
close(socket);
客户端(简称):
struct iovec received[2];
readv(socket, received, 2);
message_hdr_t header;
header.op = ((message_hdr_t *) received[0].iov_base)->op;
header.key = ((message_hdr_t *) received[0].iov_base)->key;
printf("Received op: %i, key: %i\n",header.op,header.key;
close(socket);
但客户端出现段错误,因为 received[0].iov_base
为 NULL
。为什么?套接字已正确打开,客户端已正确连接到服务器。这是一个 AF_UNIX 套接字。
最佳答案
首先,在您的服务器代码中,您正在编写一个指针。这是没有意义的。您不想通过线路传输指针。要传输字符串,您必须执行以下操作:
char* message = ...;
message_hdr_t h = {1, 11};
uint32_t message_length = strlen(message);
struct iovec tosend[3];
tosend[0].iov_base = &h;
tosend[0].iov_len = sizeof(message_hdr_t);
tosend[1].iov_base = &message_length;
tosend[1].iov_len = sizeof(message_length);
tosend[2].iov_base = message;
tosend[2].iov_len = message_length;
(您可能希望将字符串长度移动到消息头并保存 vector 的一个元素,并使协议(protocol)更具可读性)。
其次,readv
不会为您分配内存,也不会预测您要读取多少字节。您的工作是正确初始化传递给 readv
的 IO vector 中的 iov_base
和 iov_len
。为了读取动态分配的可变大小字符串,您可能需要读取两次。首先读取消息中包含字符串长度的部分,然后分配字符串,读取消息的其余部分。
关于c - 使用 readv 从 socket 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37228894/
希望你能帮帮我。 我正在尝试通过 TCP/IP 通过网络发送 1000 位的数据包,我希望也能够在 Cygwin 和 Windows 中使用重叠 I/O 技术。 在 Cygwin 中,我尝试使用“re
Linux 套接字在 readv() 上将错误设置为 ENOENT 的原因是什么? 有问题的套接字是非阻塞的并且在 Ubuntu 10.04 上运行 最佳答案 errno 仅在系统调用返回 -1 时设
我遇到了(可能)我无法解释的错误,如果有人能解释我会很高兴。 **我写了下面的程序: #include #include #include #include #include #includ
我在使用 writev()/readv() 进行的客户端-服务器通信时遇到问题。 我有两个结构,header 和 data 定义如下: typedef struct { int op;
我已经阅读了有关此错误的所有其他线程,但没有运气。 我在 RHEL 6 上使用 PHP-FPM 5.6 运行 Nginx 1.12.2 我在我网站的任何/所有页面上都收到这些错误。它与慢速请求无关。我
此示例取自 Linux System Programming书,第 88 页。 代码:http://pastebin.com/mEfmHbPP 引用的文本文件“buccaneer.txt”包含以下内容
是否有适用于 char * bufs 而不是文件描述符的 readv/writev 等效项? 例如,如果我有一个 char * buf[] 数组,并且我想将其全部复制到一个 char buf * 中。
有一个multiplayer card game我首先在 C 中将其编程为非 fork 套接字服务器(使用 poll() 调用)。 然后添加新功能对我来说太困难了,我已经切换到 Perl(使用 IO:
在 scatter 和 gather(即 readv 和 writev)中,Linux 读取多个缓冲区并从多个缓冲区。 如果说,我有一个包含 3 个缓冲区的向量,我可以使用 readv,或者我可以使用
我有带有 nginx 和 uwsgi 的 flask 的 facebook 应用程序。当它收到来自 facebook 的 POST 时,它总是有错误: readv() failed (104: Con
我只是想使用 readv() 从文件中获取一些数据。但是总是打印垃圾字符。我试图为 iovec.iov_base 分配空间,但没有运气。我什至想到了为什么要使用 readv 函数而不是坚持使用更简单和
我是一名优秀的程序员,十分优秀!