0

これは、ネットワーク プログラムを作成する最初の試みです。問題なくコンパイルされますが、実行すると「セグメンテーション違反 11」が発生します。コードの何がこの問題を引き起こしているのか、誰かが私に手がかりを与えてくれることを願っています。

私はCの新人です。

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

int main()
{   
    ////////////      GETADDRINFO   \\\\\\\\\\\\\\\\

    struct addrinfo hints, *res;
    memset(&hints, 0 , sizeof hints);

    hints.ai_family     = AF_UNSPEC;    //define the 'hints' strucure
    hints.ai_socktype   = SOCK_STREAM;  //define the 'hints' strucure
    hints.ai_protocol   = AI_PASSIVE;   //define the 'hints' strucure

    char *ipaddr = "127.0.0.1";
    getaddrinfo(ipaddr, "ftp", &hints, &res);

    //////////////     SOCKET     \\\\\\\\\\\\\\\\

    int sock = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in info;
    int bnd  = bind( sock , res->ai_addr, res->ai_addrlen);

    info.sin_family         = AF_INET;
    info.sin_port           = htons(10000);
    info.sin_addr.s_addr    = INADDR_ANY;   
    bzero(&(info.sin_zero),8); 


    ///////////////    CONNECT   \\\\\\\\\\\\\\\\\\\\\\ 

    int conct = connect( sock, res->ai_addr, res->ai_addrlen);

    //////////////     LISTEN     \\\\\\\\\\\\\\\\\\

    int lstn = listen( sock , 4 );

    //////////////    ACCEPT    \\\\\\\\\\\\\\\\\\\\\\\

    int new_fd;
    struct sockaddr_storage client_addr;
    socklen_t addr_size;
    addr_size = sizeof(client_addr);
    new_fd = accept(sock, (struct sockaddr *)&client_addr, &addr_size);

    /////////////////   SEND   \\\\\\\\\\\\\\\\\\\\\\

    char *msg = "HI!";
    int len, bytes_sent;
    len = strlen(msg);
    bytes_sent = send(sock, msg, len, 0);

    //////////////// RECEIVE \\\\\\\\\\\\\\\\\

    char burr[254];
    int cat = sizeof(burr);

    recv( sock, burr , cat , 0 );

    printf("%s", burr);
    return 0;
}
4

1 に答える 1

4

この構造が無効であるというエラーが返されるbindため、最初の時点でセグメンテーション違反が発生します。getaddrinfores

によって返されるエラーgetaddrinfo

EAI_SOCKTYPE

要求されたソケットタイプはサポートされていません。これは、たとえば、hints.ai_socktypeとhints.ai_protocolに一貫性がない場合に発生する可能性があります(たとえば、それぞれSOCK_DGRAMとIPPROTO_TCP)。

hints.ai_protocol = AI_PASSIVE正しくない設定をしました。マニュアルには次のように書かれています。

ai_protocolこのフィールドは、返されるソケットアドレスのプロトコルを指定します。このフィールドに0を指定すると、getaddrinfo()によって任意のプロトコルのソケットアドレスを返すことができることを示します。

したがって、プロトコルを取得する場合は、0に設定する必要があります。

これはセグメンテーション違反を削除しますが、プログラムは乱雑で正しくありません。

また注意してください:

リスナーソケットを使用して送受信しています。コード内に返されるソケットを使用する必要があります。acceptこれは、その間に確立されたチャネルです。new_fdsendrecv

構造を定義して初期化しましたが、info使用したことはありません。

これを見てください。これは、ソケットにすばやく入るのに役立つ可能性があります:http: //beej.us/guide/bgnet/

于 2013-01-01T07:15:03.063 に答える