【发布时间】:2013-07-01 09:04:20
【问题描述】:
使用 Unix 本地套接字编写下面的 C 源代码时,我收到一个关于地址已在使用中的错误。在检查了man 7 Unix 以获取更多信息后,我尝试创建一个子文件夹来执行我的程序(显然修改了当前文件夹上的sun_path 字段),但错误始终相同。
有人可以帮助我吗?
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
#define MAXLEN 128
int main (int argc, char *argv[]){
struct sockaddr_un server;
int serverfd, clientfd;
socklen_t addrsize = sizeof(struct sockaddr_un);
char buff[MAXLEN], *path;
if (argc < 2){
printf("Error: %s [MESSAGE]\n", argv[0]);
return 1;
}
if ((serverfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
printf("Error \"%s\" in socket()\n", strerror(errno));
exit(1);
}
puts("socket()");
server.sun_family = AF_UNIX;
path = strcpy(server.sun_path, "/home/myhome/Dropbox/Sources/C/sub");
printf("[DEBUG]Address bound at %s\n", path);
if ((bind(serverfd, (struct sockaddr*)&server, addrsize)) < 0){
printf("Error \"%s\" in bind()\n", strerror(errno));
exit(1);
}
puts("bind()");
if ((listen(serverfd, 1)) < 0){
printf("Error \"%s\" in listen()\n", strerror(errno));
exit(1);
}
if ((clientfd = accept(serverfd, NULL, &addrsize)) < 0){
printf("Error \"%s\" in accept()\n", strerror(errno));
exit(1);
}
write(clientfd, argv[1], strlen(argv[1]));
read(clientfd, buff, sizeof(buff));
puts(buff);
close(clientfd);
close(serverfd);
return 0;
}
【问题讨论】:
-
请发布您看到的确切错误消息。
-
显示的错误是这样的:“bind() 中的错误“地址已在使用中””
-
嘿,不要为 AF_UNIX 使用保管箱文件系统。它确实需要是一个本地文件系统。你可以google一下为什么。这里有龙,所以除非你在本地文件系统上尝试并重现它,否则我认为没有人可以帮助你。
-
这听起来很奇怪,因为 Dropbox 文件夹位于我的文件系统上。反正我要试试。
-
另外,如果文件存在,您确定取消链接吗? beej.us/guide/bgipc/output/html/multipage/unixsock.html
标签: c sockets unix-socket