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

1 篇文章 0 订阅
1 篇文章 0 订阅

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

 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
         }

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值