2011-09-06 110 views
4

我想写一个简单的Unix数据报服务器/客户端,并遇到一些问题。我想要的是一台服务器,它侦听数据报套接字并将收到的每条消息的回复发送给原始发件人。我决定尝试首先使用socat是“服务器”,并在C.编写客户端我正在socat是这样的:如何使用SOCK_DGRAM制作双向unix域套接字?

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo 

尽我的理解这应该监听/tmp/test.socket并回复一切是否收到相同的字符串?然后,我有一个客户端程序,它看起来像这样(为清楚起见,检查删除错误):

int s = socket(AF_UNIX, SOCK_DGRAM, 0); 
struct sockaddr_un sa; 
sa.sun_family = AF_UNIX; 
strcpy(sa.sun_path, "/tmp/test.socket"); 

const char *data = "Testing data"; 
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un)); 

printf("Sent!\n"); 

unsigned char *buffer = malloc(BUFFER_LENGTH); 
struct sockaddr_storage recv_sa; 
int recv_sa_len = 0; 
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len); 

for (int i = 0; i < recv_len; i++) { 
    putc(buffer[i], stdout); 
} 
printf("\n"); 

应该发送的数据包(的作品),接收数据包,然后打印出来,但该方案没有按” t似乎能够接收数据包。我在这里做错了什么,或者我对Unix套接字有一个基本的误解?谢谢!

回答

0

在尝试向echo服务器发送任何内容之前,您应该调用连接

看看:http://beej.us/guide/bgipc/output/html/multipage/unixsock.html

+0

是的话,由于我使用的是数据报套接字(不SOCK_STREAM),它应该像UDP一样的功能,我可以随时随地发送数据报,而不需要先连接?就像我提到的那样,客户端发送到服务器的部分确实有效。谢谢! – fyhuang

8

看一看发表在他的书的Linux编程接口的客户端/服务器程序(clientserver)的迈克尔·凯里斯克的AF_UNIX SOCK_DGRAM例如章节57

0

套接字需要有地址才能接收数据包。您可以拨打bind()与基于PID或Linux的使用独特的套接字文件名autobound抽象的地址,如果要send之前拨打:

bind(s, (const struct sockaddr *)&sa, sizeof(sa_family_t));