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

Unixドメインソケットsockaddr_unの代わりに使用するか、。に置き換える必要があります。sockaddr_inAF_UNIXAF_INET

さらに、リッスンのリターンを確認してください。

さらに、この行を変更します

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 に答える