我试图实现一个通过UDS工作的服务器进行任务,我不知道我在做什么。运行main函数的输入参数之一是UDS路径字符串。我们被告知在调用bind
之前需要取消链接。
现在我有这个:
int main( int argc, char * argv[] )
{
if ( argc != 3 )
return usage( argv[0] );
log_fd = fopen(argv[1], "a");
// create a server socket
// domain (i.e., family) is AF_UNIX
// type is SOCK_STREAM
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
socklen_t clientLength = sizeof(struct sockaddr);
struct sockaddr clientAddr;
clientAddr.sa_family = AF_INET;
pthread_t tid;
// unlink the UDS path)
unlink(argv[2]);
// bind the server socket
bind(listenfd, (SA *)&clientAddr, clientLength);
// listen
listen(listenfd, 1024);
// loop to wait for connections;
// as each connection is accepted,
// launch a new thread that calls
// recv_log_msgs(), which receives
// messages and writes them to the log file
while(1){
printf( "Waiting for a connection on UDS path %s...\n", argv[2] );
int * clientfdp = malloc(sizeof(int));
*clientfdp = accept(listenfd, (SA *) &clientAddr, &clientLength);
pthread_create(&tid, NULL, recv_log_msgs, clientfdp);
}
// when the loop ends, close the listening socket
close(listenfd);
// close the log file
fclose(log_fd);
return 0;
}
用户输入的UDS路径为argv[2]
。正如你所看到的,我从来没有真正使用它,除了取消链接,这没有多大意义。难道UDS路径是以某种方式作为bind
参数传递的吗?如果是这样,我如何从路径struct sockaddr
获取它?
编辑:
所以我必须将clientAddr
的类型更改为strcut sockaddr_un
,将家庭更改为AF_UNIX
。现在,struct有一个我应该能够设置的路径名值。但现在,当我尝试
clientAddr.sun_path = argv[2];
编译时出错:
`错误:分配给类型' char [108]'时出现不兼容的类型来自' char *'
有人有什么想法吗?