从Linux中的socket编程中侦听和接受的连接中提取IP

Saj*_*ani 4 c sockets ip network-programming

在以下代码中,我想在接受传入连接后提取已连接客户端的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);
Run Code Online (Sandbox Code Playgroud)

Nik*_*sov 11

成功返回cli_addr后accept(),您已经包含已连接客户端的IP地址和端口,格式与serv_addr变量相同.使用inet_ntop到IP转换为字符串.

  • 嗯,你在某个地方感到困惑.accept()在其第二个参数中返回客户端IP和客户端端口.你**不需要**来调用getpeername(),因为它可以提供相同的确切信息. (3认同)
  • Upvoted.我认为混淆源于sockaddr包含4字节的IP,而OP需要文本. (2认同)
  • 完全同意 - 在这种情况下,在`accept()`之后,没有必要使用`getpeername()`,`cli_addr.sin_addr`和`cli_addr.sin_port`包含连接对等体的地址和端口,格式与` getpeername()`返回. (2认同)

Tyl*_*nry 6

getpeername()

在必不可少的Beej网络编程指南中查看有关如何使用它的有用说明.

  • 无需调用`getpeername()`作为`accept()`将客户地址填入其第二个参数. (5认同)