2013-10-25 73 views
2

我有一個服務器正在偵聽端口
該請求從我的本地客戶端發送到本地pc上運行的服務器。
以下是我的代碼片斷爲什麼我從recvfrom()獲得遠程IP地址0.0.0.0?

remote_len = sizeof(remote_addr); 
if ((bytes=recvfrom(sockfd, buf, MAXBUFLEN , 0, 
(struct sockaddr *)&remote_addr, &remote_len)) <= 0) { 
    exit(1); 
} 

printf("remote ip = %s\n",inet_ntoa(remote_addr.sin_addr)); 

當我打印的IP我得到0.0.0.0?
這不是我想要打印的遠程IP地址嗎?
編輯:它是一個TCP套接字,我成功地收到了緩衝區。

+0

'recvfrom'返回什麼值?它是否成功?什麼類型的套接字?它連接了嗎? etc ... –

+0

是的,它成功了。它是一個TCP套接字 – SPB

+0

remote_len的值是什麼?您可能正在獲取IPv6回送地址。 –

回答

2

請參閱TCP recvfrom() doesn't store 'from' - 顯然它不支持TCP。你看到的只是原來存在的零字節。這就是爲什麼remote_len返回0 - 因爲沒有設置地址。

該鏈接是與windows相關的文檔;在Linux手冊頁中我沒有看到這種行爲,它只說「可能用於在套接字上接收數據,不管它是否面向連接」,但在http://www.beej.us/guide/bgnet/output/html/multipage/recvman.html上它表示recvfrom是針對UDP的。不幸的是,在Harbison + Steele中沒有提及,我找不到Unix網絡編程的副本。

+0

謝謝...現在我正在使用getpeername()來獲取遠程地址,並將recvfrom()更改爲recv() – SPB