我有這個代碼,當客戶端關閉或失去連接時獲取客戶端的IP。檢索獲得連接重置客戶端的IP地址
char buffer[80];
ssize_t bread;
struct sockaddr_in peer;
socklen_t peer_len;
peer_len = sizeof(peer);
memset(&buffer, 0, sizeof(buffer));
bread = read(connectlist[listnum], buffer, 80);
if (bread < 0)
{
if(getpeername(connectlist[listnum],(struct sockaddr *) &peer, &peer_len) == -1){
perror("getpeername() failed");
}
printf("Connection Reset From IP: %s\n", inet_ntoa(peer.sin_addr));
_Print_To_File(inet_ntoa(peer.sin_addr));
close(connectlist[listnum]);
close(connectlist[listnum]);
connectlist[listnum] = 0;
}
if(bread == 0)
{
if(getpeername(connectlist[listnum],(struct sockaddr *) &peer, &peer_len) == -1){
perror("getpeername() failed");
}
printf("Connection Closed From IP: %s\n", inet_ntoa(peer.sin_addr));
_Print_To_File(inet_ntoa(peer.sin_addr));
close(connectlist[listnum]);
connectlist[listnum] = 0;
}
當連接關閉但連接重置時,我可以得到客戶端的IP我沒有得到客戶端的IP。我在連接重置時得到0.0.0.0。我怎樣才能解決這個問題。謝謝,
'accept()'完成beforhand,會給你的客戶端地址和端口。 – alk
因此,在accept上使用struct sockaddr會給我客戶端的ip地址?..謝謝。 – demic0de
你需要檢查'errno',然後盲目地假設你有重置。這可能是其他幾件事。爲什麼你關閉了兩次插座? – EJP