【发布时间】:2017-07-31 00:21:14
【问题描述】:
我正在打开一个套接字以将请求直接发送到 X 服务器(使用 Xlib/XCB 绕过)。
#define X11_OP_REQ_CREATE_WINDOW 0x01
#define X11_OP_REQ_MAP_WINDOW 0x08
#define X11_OP_REQ_CREATE_PIX 0x35
#define X11_OP_REQ_CREATE_GC 0x37
#define X11_OP_REQ_PUT_IMG 0x48
...
struct sockaddr_un serv_addr = {0};
int socketfd = socket(AF_UNIX, SOCK_STREAM, 0); // Create the socket!
serv_addr.sun_family = AF_UNIX;
strcopy(serv_addr.sun_path, "/tmp/.X11-unix/X0", 0);
int srv_len = sizeof(struct sockaddr_un);
connect(socketfd,(struct sockaddr*)&serv_addr, sizeof(serv_addr));
不过,我必须做一堆write()s,而且我知道对于文件,这可能比fwrite 慢很多,因为缓冲,因为系统调用很昂贵。是否有与套接字一起使用的等效功能?甚至可以使用套接字进行缓冲 IO 吗? (没关系,fwrite 也需要 FILE* 流,而我只有一个描述符。)
这是发送此类请求的函数示例(使用write)。
void x11_put_img(int socketfd, struct x11_connection* conn, uint8 format, uint32 target, uint32 gc, uint16 w, uint16 h, uint16 x, uint16 y, uint8 depth, uint32* data){
uint32 packet[6];
uint16 length = ((w*h)) + 6;
packet[0] = X11_OP_REQ_PUT_IMG | format<<8 | length<<16;
packet[1] = target;
packet[2] = gc;
packet[3] = w | h<<16;
packet[4] = x | y<<16;
packet[5] = depth<<8;
write(socketfd, packet, 24);
write(socketfd, data, (w*h)*4);
return;
}
(为了简单起见,没有错误检查。)
【问题讨论】:
-
不确定你认为这会如何工作。通常,如果您通过套接字发送某些内容,您会在发送下一个命令之前等待回复。使用缓冲写入,您还拥有缓冲读取和某种消息队列。不确定这是否真的值得开销。