【发布时间】:2016-09-10 18:22:47
【问题描述】:
我在使用 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 套接字。
【问题讨论】:
-
什么是
struct iovec? -
@alk 是标准的 POSIX 结构。
标签: c sockets unix-socket