本地套接字绑定错误
Bind error in local socket
我必须编写一些代码来执行以下操作:
客户端从键盘读取输入并将字符串发送到服务器。服务器打印客户端的 IP 和字符串。
编译时间没问题,但是当我 运行 代码出现绑定错误 "no such file or directory"
我已经在论坛上查看了beej的指南和其他问题,但无法解决问题。
感谢任何帮助。
编辑:除了控制读写的return值外,我做了你让我做的改变,因为程序没有进入while循环!另外,setsockopt 不起作用。
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<sys/un.h>
int main(void)
{
int fd1,fd2,test,lun,n,enable=1;
socklen_t len;
struct sockaddr_un indirizzo_serv, indirizzo_cl;
char buf[100]={0},temp[100]={0};
fd1=socket(PF_LOCAL,SOCK_STREAM,0); //creo socket locale
if(fd1<0)
perror("Errore nella creazione del socket\n");
else printf("Socket OK\n");
indirizzo_serv.sun_family=AF_LOCAL;
strcpy(indirizzo_serv.sun_path,"/tmp/socket1000");
//lun=strlen(indirizzo_serv.sun_path)+sizeof(indirizzo_serv.sun_family);
if(setsockopt(fd1,SOL_SOCKET,SO_REUSEADDR,&enable,sizeof(int))<0)
perror("Errore in setsockopt REUSEADDR\n");
test=bind(fd1,(struct sockaddr*)&indirizzo_serv,sizeof(indirizzo_serv));
if(test==0){
printf("Bind OK\n");
test=listen(fd1,2);
if(test==0){
printf("listen OK\n");
len=sizeof(struct sockaddr_un);
while(1){
fd2=accept(fd1,(struct sockaddr*)&indirizzo_cl,&len);
if(fd2<0)
perror("\nErrore nella accept\n");
else printf("Accept OK\n");
write(STDOUT_FILENO,"Client - Inserire la stringa da inviare al server: \n",strlen("Client - Inserire la stringa da inviare al server: \n"));
read(STDIN_FILENO,buf,sizeof(buf));
write(fd2,buf,strlen(buf));//write(fd1,buf,strlen(buf));
read(fd2,buf,strlen(buf));
sprintf(temp,"Server - IP del client: %s\n",indirizzo_cl.sun_path);
write(STDOUT_FILENO,temp,strlen(temp));
memset(buf,0,100);
memset(temp,0,100);
}
}
else perror("Errore nella listen\n");
}
else perror("Errore nella bind\n");
unlink(indirizzo_serv.sun_path);//close(fd1);
return 0;
}
编译仍有问题(test=0
=> test==0
;int len;
=> socklen_t len;
(错误的签名)。你应该用 -Wall
编译并在询问之前将它们整理出来。
您的错误很可能是由于路径中缺少目录。
替换一个肯定存在的路径,例如 /tmp/socket1
可以让它在我的电脑上运行。
您正在写入您的侦听套接字,更改:
write(fd1,buf,strlen(buf));
进入:
write(fd2,buf,strlen(buf));
此外:您应该检查从 read()
获得的 return 值,而不是 ( memset(buf,0,100);
) 在每个循环中将缓冲区归零
和:
if(test=0){
总是假的,因为它是一个赋值。 (也许你想要 if(test == 0){
? )
我必须编写一些代码来执行以下操作: 客户端从键盘读取输入并将字符串发送到服务器。服务器打印客户端的 IP 和字符串。 编译时间没问题,但是当我 运行 代码出现绑定错误 "no such file or directory" 我已经在论坛上查看了beej的指南和其他问题,但无法解决问题。 感谢任何帮助。
编辑:除了控制读写的return值外,我做了你让我做的改变,因为程序没有进入while循环!另外,setsockopt 不起作用。
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<sys/un.h>
int main(void)
{
int fd1,fd2,test,lun,n,enable=1;
socklen_t len;
struct sockaddr_un indirizzo_serv, indirizzo_cl;
char buf[100]={0},temp[100]={0};
fd1=socket(PF_LOCAL,SOCK_STREAM,0); //creo socket locale
if(fd1<0)
perror("Errore nella creazione del socket\n");
else printf("Socket OK\n");
indirizzo_serv.sun_family=AF_LOCAL;
strcpy(indirizzo_serv.sun_path,"/tmp/socket1000");
//lun=strlen(indirizzo_serv.sun_path)+sizeof(indirizzo_serv.sun_family);
if(setsockopt(fd1,SOL_SOCKET,SO_REUSEADDR,&enable,sizeof(int))<0)
perror("Errore in setsockopt REUSEADDR\n");
test=bind(fd1,(struct sockaddr*)&indirizzo_serv,sizeof(indirizzo_serv));
if(test==0){
printf("Bind OK\n");
test=listen(fd1,2);
if(test==0){
printf("listen OK\n");
len=sizeof(struct sockaddr_un);
while(1){
fd2=accept(fd1,(struct sockaddr*)&indirizzo_cl,&len);
if(fd2<0)
perror("\nErrore nella accept\n");
else printf("Accept OK\n");
write(STDOUT_FILENO,"Client - Inserire la stringa da inviare al server: \n",strlen("Client - Inserire la stringa da inviare al server: \n"));
read(STDIN_FILENO,buf,sizeof(buf));
write(fd2,buf,strlen(buf));//write(fd1,buf,strlen(buf));
read(fd2,buf,strlen(buf));
sprintf(temp,"Server - IP del client: %s\n",indirizzo_cl.sun_path);
write(STDOUT_FILENO,temp,strlen(temp));
memset(buf,0,100);
memset(temp,0,100);
}
}
else perror("Errore nella listen\n");
}
else perror("Errore nella bind\n");
unlink(indirizzo_serv.sun_path);//close(fd1);
return 0;
}
编译仍有问题(test=0
=> test==0
;int len;
=> socklen_t len;
(错误的签名)。你应该用 -Wall
编译并在询问之前将它们整理出来。
您的错误很可能是由于路径中缺少目录。
替换一个肯定存在的路径,例如 /tmp/socket1
可以让它在我的电脑上运行。
您正在写入您的侦听套接字,更改:
write(fd1,buf,strlen(buf));
进入:
write(fd2,buf,strlen(buf));
此外:您应该检查从 read()
memset(buf,0,100);
) 在每个循环中将缓冲区归零
和:
if(test=0){
总是假的,因为它是一个赋值。 (也许你想要 if(test == 0){
? )