gpt4 book ai didi

c - 重用 linux 抽象命名空间套接字

转载 作者:太空狗 更新时间:2023-10-29 11:12:32 24 4
gpt4 key购买 nike

我想在一个服务器 session 期间重用一个抽象套接字地址。我试图关闭套接字并再次绑定(bind)它们,但它不起作用。

服务器.c:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

int main()
{
struct sockaddr_un workmanaddr;
workmanaddr.sun_family=AF_UNIX;
strcpy(workmanaddr.sun_path+1,"name");
workmanaddr.sun_path[0]='0';
char buf[255];
int sd = socket(AF_UNIX, SOCK_DGRAM, 0);
if(sd <0)
{
perror("socket() error");
exit(2);
}
if((bind(sd , (struct sockaddr *)&workmanaddr,sizeof(workmanaddr)))<0)
{
perror("bind() error");
exit(3);
}
while(true)
{
recv(sd, buf, sizeof(buf), 0);
printf("%s\n",buf);
close(sd);
sd = socket(AF_UNIX, SOCK_DGRAM, 0);
if(sd <0)
{
perror("socket() error");
exit(2);
}
if((bind(sd , (struct sockaddr*)&workmanaddr,sizeof(workmanaddr)))<0)
{
perror("bind() error");
exit(3);
}
}
return 0;
}

客户端.c:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
int main(int argc, char *argv[])
{
char _path[108]="name";
struct sockaddr_un tempadres = {0};
int tmpsock;
tmpsock = socket(AF_UNIX, SOCK_DGRAM, 0);
if(tmpsock<0)
{
perror("socket() error");
exit(2);
}
tempadres.sun_family=AF_UNIX;
strcpy(tempadres.sun_path+1,_path);
tempadres.sun_path[0]='0';
if((connect(tmpsock, (struct sockaddr *)&tempadres,sizeof(tempadres)))<0)
{
perror("connect() error");
exit(3);
}
char buf[255];
scanf("%s",buf);
if(send(tmpsock, buf, sizeof(buf), 0)<0)
{
perror("send() error");
exit(4);
}
return 0;
}

我应该怎么做才能使其多次重复使用?有什么建议吗?

最佳答案

在这一行中:tempadres.sun_path[0]='0','0' 不是空字节,抽象套接字要求 sun_path 字段。所以它不会被视为抽象套接字。将其更改为 tempadres.sun_path[0]=0tempadres.sun_path[0]='\0'


PS:你的server.c还有一个问题,你没有把workmanaddr归零,所以sun_path 很可能包含垃圾值,因为它是在堆栈上分配的,即使您调用了 strcpy(workmanaddr.sun_path+1,"name"); 并附加了一个空字节,因为所有sun_path 中的剩余字节定义套接字的“名称”。它会导致与客户端不同的套接字名称,导致客户端拒绝连接。

关于c - 重用 linux 抽象命名空间套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785523/

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