Socket,accept()函数,参数无效

时间:2013-01-14 11:42:03

标签: c linux sockets

当我在客户端 - 服务器应用程序的服务器端调用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 个答案:

答案 0 :(得分:3)

对于Unix域套接字,您必须使用sockaddr_un而不是sockaddr_in,或者将AF_UNIX替换为AF_INET

另外,请检查听说的回归。

另外更改此行

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

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

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

另外,如@trojanfoe所述,将server client结构放入accept()来电

答案 1 :(得分:1)

这一行:

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

应该是:

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

来自manpage

  

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

同时检查listen()的返回值。

答案 2 :(得分:1)

看起来你的套接字遇到了一些麻烦,所以我上传了一个老师给我一次的指导,以便快速介绍网络编程。希望能帮助到你。

Download Here

答案 3 :(得分: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);
    }