1. 苏葳的备忘录首页
  2. 编程

用Socket的getpeername获得客户端的ip和端口

c语言 socketgetsockname用于获得本地地址端口,getpeername用于获取远端地址端口。但两者的使用时机并不相同。对于服务器来说,在bind以后就可以调用getsockname来获取本地地址和端口,虽然这没有什么太多的意义。getpeername只有在链接建立以后才调用,否则不能正确获得对方地址和端口,所以他的参数描述字一般是链接描述字而非监听套接口描述字。下面是个getpeername的例子:

#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string.h>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
int getpeeraddr(int sockfd)
{
    char peeraddrstr[60];
    char peerip[18];
    struct sockaddr_in peeraddr;
    socklen_t len;
    string timearg = gettime();
    int ret = getpeername(sockfd, (struct sockaddr *)&peeraddr, &len);
    if (ret < 0)
        return 0;
    sprintf(peeraddrstr, "time: %s\npeer address: %s:%d\n\n", timearg.c_str(), inet_ntop(AF_INET, &peeraddr.sin_addr, peerip, sizeof(peerip)), ntohs(peeraddr.sin_port));
    ofstream out("/home/connectlog", ios::app);
    out.write(peeraddrstr, strlen(peeraddrstr));
    out.close();
}
//获取当前日期及时间
string gettime()
{
   time_t t;
   struct tm *tm;
   char buf[20];
   t=time(NULL);
   tm=localtime(&t);
   snprintf(buf, 20, "%04d%02d%02d%02d%02d%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
    string sendmsg(buf);
    return sendmsg;
}

 

 

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/309.html

发表评论

邮箱地址不会被公开。 必填项已用*标注