Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字,accept()函数,参数无效_C_Linux_Sockets - Fatal编程技术网

套接字,accept()函数,参数无效

套接字,accept()函数,参数无效,c,linux,sockets,C,Linux,Sockets,在客户端-服务器应用程序的服务器端调用accept()函数时,出现错误“Invalid argument”。我不明白什么是错的,如果你看到什么是错的,请让我知道。谢谢 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char* argv[]) { int sockfd,

在客户端-服务器应用程序的服务器端调用accept()函数时,出现错误“Invalid argument”。我不明白什么是错的,如果你看到什么是错的,请让我知道。谢谢

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>


int main(int argc, char* argv[])
{
    int sockfd, newsockfd, portno, len;
    struct sockaddr_in server, client;

    if(argc < 2){
        perror("Add more arguments");
    }

    sockfd = socket(AF_UNIX,SOCK_STREAM,0);
    if(sockfd < 0){
        perror("Error at socket()");    
    }
    printf("Socketfd: %d\n",sockfd);
    bzero((char *)&server, sizeof(server));
    portno = atoi(argv[1]);
    server.sin_family = AF_UNIX;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(portno);

    if(bind (sockfd, (struct sockaddr *)&server, sizeof(server)) <0){
        perror("Error at bind ()-server");  
    }

    listen(sockfd,5);

    int readval;
    char buffer[256];
    for(;;){
        len = sizeof(client);
        newsockfd = accept (sockfd, (struct sockaddr *)&server,&len);
        if (newsockfd == -1){
            perror("Erroare at accept()");      
        }
        else do{        
            readval = (sockfd,buffer,sizeof(buffer));
            if (readval < 0 ){
                perror("Error at reading()");       
            }
            else if (readval == 0){
                printf("End conection");            
            }
            else{
                printf("Mesage is: %s\n", buffer);
            }
        }while (readval > 0);
        close(newsockfd);
    }
    return 0;   
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int sockfd、newsockfd、端口号、len;
服务器、客户端中的结构sockaddr_;
如果(argc<2){
perror(“添加更多参数”);
}
sockfd=socket(AF_UNIX,SOCK_流,0);
if(sockfd<0){
perror(“套接字()处出错”);
}
printf(“Socketfd:%d\n”,sockfd);
bzero((char*)&server,sizeof(server));
portno=atoi(argv[1]);
server.sin_family=AF_UNIX;
server.sin\u addr.s\u addr=INADDR\u ANY;
server.sin_port=htons(端口号);
if(bind(sockfd,(struct sockaddr*)&server,sizeof(server))0);
关闭(newsockfd);
}
返回0;
}
此行:

newsockfd = accept (sockfd, (struct sockaddr *)&server, &len);
应该是:

newsockfd = accept (sockfd, (struct sockaddr *)&client, &len);
从:

参数addr是指向sockaddr结构的指针。这个结构 由对等套接字的地址填充,如 通信层。返回地址addr的确切格式为 由套接字的地址族确定(参见套接字(2)和 各协议手册页)。当addr为NULL时,不填充任何内容 在里面在本例中,不使用addrlen,也应为NULL


还要检查
listen()

中的返回值。对于Unix域套接字,您必须使用
sockaddr\u un
而不是
sockaddr\u in
,或者用
AF\u INET
替换
AF\u Unix

另外,检查listen的返回

再加上换这一行

readval = (sockfd,buffer,sizeof(buffer));

因为数据将通过新创建的套接字而不是侦听套接字发送


另外,正如@trojanfoe所提到的,将
服务器
客户端
结构替换为
accept()
调用

之前我遇到过类似的问题,这是因为循环中没有读取功能。这是我以前做过的一个例子

while (1) {
        new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr,
                 &sin_size);
        if (new_sockfd == -1)
            perror("accepting connection");
        printf("server: got connection from %s port %d\n",
            inet_ntoa(client_addr.sin_addr),
            ntohs(client_addr.sin_port));
        recv_length = recv(new_sockfd, &buffer, DATA, 0);

        while (recv_length > 0) {
            printf("RECV: %d bytes\n", recv_length);
            dump(buffer, recv_length);
            recv_length = recv(new_sockfd, &buffer, DATA, 0);
        }

        close(new_sockfd);
    }

您将
len
设置为
sizeof(客户端)
,但传入
&服务器
?(我认为这不是你的问题,但它不可能是对的。)这里缺少一些东西:
readval=(sockfd,buffer,sizeof(buffer))
您还需要检查
listen()
的返回值。为什么要将
&server
强制转换为
struct sockaddr*
,而它已经是该类型???好的,所以我的sock id是3。我检查了listen的返回值,它是-1(因此我在那里也得到了一个错误)。此外,在这些更改之后,我在bind上也遇到了一个错误(“地址已在使用”)。好的,这个错误在
listen
中非常常见,您需要
setsockopt()
以便重用端口。
listen()
是问题的根本原因,而不是我的回答中所述的传递给
accept()
的错误地址(这只会导致一个小错误)。
while (1) {
        new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr,
                 &sin_size);
        if (new_sockfd == -1)
            perror("accepting connection");
        printf("server: got connection from %s port %d\n",
            inet_ntoa(client_addr.sin_addr),
            ntohs(client_addr.sin_port));
        recv_length = recv(new_sockfd, &buffer, DATA, 0);

        while (recv_length > 0) {
            printf("RECV: %d bytes\n", recv_length);
            dump(buffer, recv_length);
            recv_length = recv(new_sockfd, &buffer, DATA, 0);
        }

        close(new_sockfd);
    }