1

これが私の問題です:

サーバーとクライアント間の通信を処理するプログラムで使用できるように、ソケットアドレス構造体に適切な情報を入力しようとしています。これはサーバー コードの一部です。問題は、セグメンテーション違反です。を実行すると、構造体の属性gdbに割り当てるとセグフォルトが発生すると表示されます。AF_INETsin_familyservaddr

コード:

servaddr->sin_family = (short)(AF_INET); 

なぜこれが起こるのか理解できないようです。

完全なコードは次のとおりです。

// Function Prototypes
struct sockaddr_in* getServerInfo(char[]);

int main()
{

    char hostname[MAXHOSTNAMELEN];
    struct sockaddr_in* servaddr = getServerInfo(hostname);

 return 0;
} // End main

struct sockaddr_in* getServerInfo(char hostname[])
{

    struct sockaddr_in* servaddr = malloc((size_t)sizeof(struct sockaddr_in));
    gethostname(hostname, 32);
    struct hostent *hostptr;
    hostptr = gethostbyname(hostname);

    memset((void *) &servaddr, 0, (size_t)sizeof(servaddr));
    servaddr->sin_family = (short)(AF_INET);
    memcpy((void *)& servaddr->sin_addr, (void *) hostptr->h_addr, hostptr->h_length);
    servaddr->sin_port = htons((u_short)8000);

    return servaddr;
}
4

1 に答える 1

1

あなたのバグはここにあります:

memset((void *) &servaddr, 0, (size_t)sizeof(servaddr));

代わりにこれを行います:

memset((void *) servaddr, 0, (size_t)sizeof(*servaddr));

それ以外の場合は、servaddr のポインターをゼロにします (つまり、NULL にします)。これは、使用しようとすると爆発します。

同様に、memcpy 呼び出しを変更する必要があります。

于 2013-01-21T01:08:04.307 に答える