簡體   English   中英

Mac OS X上的C插槽

[英]C Sockets on Mac OS X

我正在嘗試將套接字與C一起使用。現在我正在編寫服務器端軟件。 我的新連接處理程序:

int handle_new_connection(SOCKET *server_socket_descriptor, unsigned int *max_known_socket_descriptor, fd_set *main_socket_set)
{
    const int yes = 1;

    struct sockaddr_in remote_address;
    SOCKET new_connection_socket_descriptor;
    int address_size;
    char buffer[1000] = {0};
    struct hostent *host_entry;

    address_size = sizeof(struct sockaddr_in);

    if (SOCKET_ERROR == (new_connection_socket_descriptor = accept((*server_socket_descriptor), (struct sockaddr *)&remote_address, (socklen_t *)&address_size)))
    {
        return SOCKET_ERROR;
    }

    if ( SOCKET_ERROR == setsockopt(new_connection_socket_descriptor, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)))
    {
        return SOCKET_ERROR;
    }

    printf ("Server: new connection from \'%s\' accepted successfully.\n", inet_ntoa(remote_address.sin_addr));

    unsigned long remote_address_size = sizeof(remote_address.sin_addr);

    if (NULL == (host_entry = gethostbyaddr((void *)&(remote_address.sin_addr), (socklen_t)&(remote_address_size), AF_INET)))
    {
        closesocket (new_connection_socket_descriptor);
        printf ("Server: new connection from \'%s\' was immediately closed because of gethostbyaddr() failure.\n", host_entry -> h_addr);
        return SOCKET_ERROR;
    }

    printf("Been here!\n");


    return 1;
}

當新用戶通過telnet連接時, if句子if (NULL == (host_entry = gethostbyaddr((void *)&(remote_address.sin_addr), (socklen_t)&(remote_address_size), AF_INET)))帶來錯誤: Segmentation fault: 11 另外,此代碼在Linux上也能完美運行。 我的操作系統是Mac OSX。如何解決此問題?

您正在將remote_address_size的地址作為gethostbyaddr()len參數傳遞。 該參數不應直接是地址,而應是長度值。


更新:

另外,您可能不會從accept()獲得struct sockaddr_in 例如,如果連接是IPv6連接,則將獲得struct sockaddr_in6 最安全的方法是使用struct sockaddr_storage

理想情況下,您應該從gethostbyaddr()切換到getnameinfo() 后者采用struct sockaddr*參數,您可以向其提供指向struct sockaddr_storage的指針,而不必關心它實際包含的地址族。 手冊頁包含示例代碼。

如果要繼續使用gethostbyaddr() ,則需要檢查struct sockaddr_storagesa_family字段。 如果是AF_INET ,則應使用&((struct sockaddr_in*)&remote_address)->sin_addr作為第一個參數。 如果是AF_INET6 ,則應使用&((struct sockaddr_in6*)&remote_address)->sin6_addr 第二個參數是相同字段的大小。

如果是其他家庭,則需要查找如何處理該問題,或者針對代碼無法理解的情況返回失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM