gpt4 book ai didi

c - 使用 Unix 套接字获取 "Address already in use"错误

转载 作者:太空狗 更新时间:2023-10-29 17:02:07 25 4
gpt4 key购买 nike

使用 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 调用之前unlink() path 文件。如果文件在 bind 期间存在,您将收到此错误。您应该确保在退出应用程序之前取消链接/删除文件,或者您始终可以在绑定(bind)之前取消链接。

查看 bind 的手册页.另外,请注意最后手册页中给出的示例。

关于c - 使用 Unix 套接字获取 "Address already in use"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com