簡體   English   中英

從Linux中的socket編程中偵聽和接受的連接中提取IP

[英]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() - 通過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.

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