4

当我在客户端-服务器应用程序的服务器端调用 accept() 函数时,出现错误“无效参数”。我不明白出了什么问题,如果您发现出了什么问题,请告诉我。谢谢。

#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;   
}
4

3 回答 3

3

您必须使用sockaddr_un而不是sockaddr_in用于 Unix 域套接字或AF_UNIXAF_INET.

另外,检查listen的返回。

加上更改此行

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

readval = read(newsockfd,buffer,sizeof(buffer));

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

另外,正如@trojanfoe 所提到的server,将client结构替换为accept()调用

于 2013-01-14T12:02:24.873 回答
2

这一行:

newsockfd = accept (sockfd, (struct sockaddr *)&server, &len);

应该:

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

手册页

参数 addr 是指向 sockaddr 结构的指针。如通信层所知,该结构用对等套接字的地址填充。地址返回 addr 的确切格式由套接字的地址族确定(参见 socket(2) 和相应的协议手册页)。addr为NULL时,不填任何内容;在这种情况下,不使用 addrlen,也应该为 NULL。

还要检查来自的返回值listen()

于 2013-01-14T11:50:44.957 回答
0

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

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);
    }
于 2016-01-19T19:16:32.413 回答