【发布时间】:2011-01-03 03:02:32
【问题描述】:
我正在尝试使用 X Window 系统协议文档编写自己的程序,该程序连接到不使用 Xlib 或 XCB 的本地 X 服务器。将连接数据写入服务器套接字后,由于读取功能阻塞,我似乎无法回读服务器的回复。
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
int main()
{
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un serv_addr;
memset((void*)&serv_addr, 0, sizeof(serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path, "/tmp/.X11-unix/X0");
int servlen = 17 + sizeof(serv_addr.sun_family);
int err = connect(sockfd, (struct sockaddr*)&serv_addr, servlen);
printf("%d\n", err);
struct
{
uint8_t en;
uint8_t pad;
uint16_t major;
uint16_t minor;
uint16_t name_len;
uint16_t data_len;
uint16_t pad2;
uint8_t name[4];
uint8_t data[4];
} init;
init.en = 'l';
init.major = 11;
init.minor = 0;
init.name_len = 0;
init.data_len = 0;
err = write(sockfd, init, sizeof(init));
printf("%d\n", err);
uint8_t buf[5000];
int n = read(sockfd, buf, 5000);
return 0;
}
我的代码中缺少什么?连接和写入函数返回 0。
【问题讨论】:
-
您能否确认服务器 (1) 收到了您发送给它的数据,并且 (2) 正在响应您期望返回的数据?
-
写函数返回0所以我猜可以假设服务器收到了数据,根据读函数没有返回,服务器根本没有响应。
-
write返回写入的字节数,因此返回零表示根本没有写入任何内容。此外,write的返回类型是ssize_t而不是int,但这不是你的问题。 -
我犯了一个愚蠢的错误,write 函数最初返回 -1,这就是为什么我可能会将 0 与成功混淆。