使用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;
}
答案 0 :(得分:13)
在unlink()
致电之前,您应该path
bind
个文件。在bind
期间文件存在时,您将收到此错误。您应该确保在退出应用程序之前取消链接/删除文件,或者您可以在绑定之前始终取消链接。
查看bind的手册页。另外,请注意最后手册页中给出的示例。
答案 1 :(得分:0)
经过很长一段时间我写这个问题后,我正在写作。但是,对于那些仍在寻找可能的解决方案的人来说,这是我的经验。
我正在开发基于Linux的服务器并创建一个套接字作为IPC。我得到了类似的错误,但这是因为我通过终端运行了可执行文件而没有使用关键字'sudo'。
希望这有帮助。
答案 2 :(得分:-4)
您可以尝试使用SO_REUSEADDR标志,如下所示:
int yes = 1;
if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
// error handling
exit(1);
}