[英]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_storage
的sa_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.