3

これが取り引きです。接続を受け入れることができない単純なtcpソケットサーバーをCで(UNIXシステムコールを使用して)書いています。

私が知る限り、サーバーの初期化は問題なく完了しますが、印刷したポート (以下のコードを参照) に接続しようとすると、何もないかのように拒否されます。

さらに言えば、そのポートは使用されていません。私は現在のセットアップでエラーを投げていません。私はすべてアイデアが枯渇しています。

int main(){

    int sock_fd;
    int conn_fd;
    struct sockaddr_in serv_addr;
    struct sockaddr_in cli_addr;
    socklen_t* serlen;
    socklen_t* clilen;
    clilen  = malloc(sizeof(socklen_t));
    serlen  = malloc(sizeof(socklen_t));
    *serlen = sizeof(serv_addr);
    *clilen = sizeof(cli_addr);

    /*=============================Create Socket=============================*/


        //Create Socket
        sock_fd = socket(AF_INET, SOCK_STREAM, 0);
            if(sock_fd<0){
                fprintf(stderr,"error creating socket\n");
                exit(1);}

        //Initialize Server Address Struct
        bzero((char *) &serv_addr, *serlen);
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = 0;

    /*=============================Bind Address==============================*/

        //Bind socket to an address
        if(bind(sock_fd,(struct sockaddr*)&serv_addr,*serlen)<0){
            fprintf(stderr,"error binding\n");
            exit(1);}

        //Get socket data
        if(getsockname(sock_fd,(struct sockaddr*)&serv_addr, serlen)<0){
            fprintf(stderr,"error with socket name");
            exit(1);}

    /*=============================Server Started============================*/

        //Listen for connections
        listen(sock_fd,32);

        //Print port
        printf("%i", serv_addr.sin_port);

        conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen);

        /**Do something exciting with my new connection**/

}
4

3 に答える 3

5

本当にポート 0 でリッスンしようとしていますか? できれば 1024 より大きいポート番号を試してください。/etc/services は空きポートに関するヒントを提供しますが、これは一連のコメントのみであり、それらのポート番号は強制されません。

編集:別のヒント。ポート番号はネットワーク順である必要があるため、割り当てには を使用する必要がありますhtons()。リトルエンディアン マシン (Intel など) を使用している可能性があるため、取得している「乱数」が文字化けして見える単純な数値である可能性があります。それらを印刷するときは、 を使用して元に戻しntohs()ます。

于 2012-12-11T08:51:51.533 に答える
3

これにインスピレーションを与えてくれた@askmishへの小道具

    //Print port
    printf("%i", serv_addr.sin_port);

になる

    //Print port
    printf("%i", htons(serv_addr.sin_port));
于 2012-12-11T10:10:25.810 に答える
2

あなたのコードで:

  • それ以外の:

    serv_addr.sin_port = 0;
    

    これを試して:

    serv_addr.sin_port=htons(2056);//Any port no. 
    
  • それ以外の:

     listen(sock_fd,32);
    

    これを試して:

     if(listen(sock_fd,SOMAXCONN)<0)//Just to be sure that you are considering max. no. of requests
     {  fprintf(stderr,"error with listen");
        exit(1);}
    
  • 次の場合にも使用できます。

     conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen);
    

    これを追加:

     if(conn_fd <0)
     {
       //handle the error here
     }
    

これらのいずれも問題を解決しない場合は、クライアント コードまたはサーバー環境に問題がある可能性があります。

于 2012-12-11T09:49:11.053 に答える