SOCKET通信中的各种ip问题,服务端获取客户端ip地址

这篇具有很好参考价值的文章主要介绍了SOCKET通信中的各种ip问题,服务端获取客户端ip地址。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在进行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

        在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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包