在进行socket网络通信的时候,我们经常需要获取ip地址,下面介绍一些获取ip地址的方法。
1.自动获取本机ip地址
可以获取本地所有ip地址,可根据自己需求取出ip。
void getIP()
{
struct ifconf ifconf;
struct ifreq* ifreq;
char buf[512];
ifconf.ifc_len = 512;
ifconf.ifc_buf = buf;
ioctl(sfd, SIOCGIFCONF, &ifconf); //获取全部接口信息
ifreq = (struct ifreq*)ifconf.ifc_buf;
int i = (ifconf.ifc_len / sizeof(struct ifreq));
for (i; i > 0; i--)
{
if (ifreq->ifr_flags == AF_INET)
{ //for ipv4
printf("name =[%s]\n", ifreq->ifr_name);
printf("local addr = [%s]\n", inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
ip = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);
ifreq++;
}
}
}
2.在绑定套接字的时候,要获取本机ip
可用INADDR_ANY,宏INADDR_ANY转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思,也可以自己填入需要的ip,比如上述函数获得的某一个ip。
sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sfd < 0)
{
return -1;
}
memset(&ser_addr, 0, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);//inet_addr(“127.0.0.1”)
//。宏INADDR_ANY转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思
ser_addr.sin_port = htons(5150); //注意网络序转换
int flag = 1;
int result = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(flag));//端口复用
rre = bind(sfd, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
if (rre < 0)
{
cout << "bind fail" << endl;
printf("%d\n", errno);
return -1;
}
cout << "bind successfully!" << endl;
3.服务端获取客户端ip文章来源:https://www.toymoban.com/news/detail-530459.html
在socket通信时,服务器使用recvform函数接收客户端报文时,客户端ip信息会包含在服务器端的结构体内。比如下面的例子,以下是服务端接收代码。inet_ntoa(ser_addr.sin_addr),如果客户端地址是"192.168.2.2",在服务端打印出来的这个ip就是"192.168.2.2",文章来源地址https://www.toymoban.com/news/detail-530459.html
int rre = recvfrom(sfd, &recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&ser_addr, &len);
if (rre < 0)
{
cout << "recvie fail" << endl;
}
else
{
cout << "recvie successfully!" << endl;
cout<<"toolIP= "<<inet_ntoa(ser_addr.sin_addr) << endl;//客户端ip
}
到了这里,关于SOCKET通信中的各种ip问题,服务端获取客户端ip地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!