c - 本地套接字绑定(bind)错误

标签 c sockets unix bind unix-socket

我必须编写一些执行以下操作的代码: 客户端从键盘读取输入并将字符串发送到服务器。服务器打印客户端的 IP 和字符串。 编译时间很好,但是当我运行代码时出现绑定(bind)错误“没有这样的文件或目录” 我已经检查了beej的指南和论坛上的其他问题,但无法解决问题。 如有任何帮助,我们将不胜感激。

编辑:我做了你告诉我要做的更改,除了控制读写的返回值,因为程序不进入 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)使其可以在我的电脑上运行。

关于c - 本地套接字绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43438705/

相关文章:

c - 指向多维数组的指针

c++ - 重负载下 C/C++ 中的内存泄漏检查

c - 没有主循环的 GLIB 用法

node.js - 远程服务器的socket.io主机名

c++ - QDialog::accept 不响应关闭

java - udp 服务器上的 java 地址已在使用错误

java - 使用 JNI 问题构建 .so 文件

linux - (FUSE) 文件系统何时检查访问权限?

c - 跨内核的纳秒计时?

c - 为什么我的生产者消费者阻塞了?