[英]Extract IP from connection that listen and accept in socket programming in Linux in c
在以下代碼中,我想在接受傳入連接后提取已連接客戶端的IP地址。 在accept()
實現之后我該怎么辦?
int sockfd, newsockfd, portno, clilen;
portno = 8090;
clilen = 0;
pthread_t serverIn;
struct sockaddr_in serv_addr, cli_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("ERROR opening socket");
}
bzero((char *) & serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
serv_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *) & serv_addr, sizeof (serv_addr)) < 0)
{
perror("ERROR on binding");
}
listen(sockfd, 5);
clilen = sizeof (cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) & cli_addr, &clilen);
在accept()
成功返回后, cli_addr
已包含已連接客戶端的IP地址和端口,格式與serv_addr
變量相同。 使用inet_ntop
將IP轉換為字符串。
getpeername()
我認為不需要getpeername()
- 通過accept()
調用已經將客戶端地址填充到cli_addr
。
您只需要使用inet_ntop()
, getnameinfo()
或gethostbyaddr()
來打印或獲取更多信息。
您可以按照以下示例操作:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
{
int s;
struct sockaddr_in peer;
int peer_len;
.
.
.
/* We must put the length in a variable. */
peer_len = sizeof(peer);
/* Ask getpeername to fill in peer's socket address. */
if (getpeername(s, &peer, &peer_len) == -1) {
perror("getpeername() failed");
return -1;
}
/* Print it. The IP address is often zero because */
/* sockets are seldom bound to a specific local */
/* interface. */
printf("Peer's IP address is: %s\n", inet_ntoa(peer.sin_addr));
printf("Peer's port is: %d\n", (int) ntohs(peer.sin_port));
.
.
.
}
API在手冊頁中進行了描述。 您可以從控制台瀏覽它們,從man socket
開始並按照man getpeername
引用或使用Konqueror,如果你要求#socket
地址,它可以很好地使用鏈接。 在我的Kubuntu案例中,有必要安裝manpages-dev
軟件包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.