出现问题的原因
我这边出现问题的代码如下:
SOCKADDR_IN clientAddr;
acceptSocket = accept(ProxyServer, (SOCKADDR*)&clientAddr, NULL);
printf("客户端IP为:%s", inet_ntoa(clientAddr.sin_addr));//输出204.204.204.204
我这里是accept
函数出现了这个问题,其实用getpeername
等函数获取有问题的,应该都大同小异,不信往下读一读: )。
代码一亮出来,老师傅可能一眼就看出来问题所在了,但是却折腾了我半个小时,相信点进来的朋友也都有类似的问题吧!
首先解释为啥是204.204.204.204
或者0xcccccccc
:
204换成16进制是0xcc,这是vc初始化堆栈的时候使用的数据。
所以说,如果出现了204.204.204.204
,那么说明数据没有被正确的写入我们所指定的SOCKADDR_IN
类型的变量中。
解决方案
accept
函数的第三个参数,是要求我们写入第二个参数的大小的!但是出问题的代码里面用的是NULL
!不信看看上方第二行代码!
(p.s. 这是俺们某次实验,老师给了实例代码,默认第二个参数、第三个参数都是NULL
,但是要往上魔改加新功能啊,但是俺又是新手啊!!就只改了第二个参数,第三个参数忘记改了!!!)
解决方案也很简单,把第三个参数给了就可以了(笑)
用getpeername
等函数获取有问题的,解决方法同理,把大小
参数给指定了就可以了!
所以上方代码更正后的结果如下:
SOCKADDR_IN clientAddr;
int sockaddr_in_size = sizeof(SOCKADDR_IN);//给定第三个参数
acceptSocket = accept(ProxyServer, (SOCKADDR*)&clientAddr, &sockaddr_in_size);//把第三个参数传进去
printf("客户端IP为:%s", inet_ntoa(clientAddr.sin_addr));
参考链接
[1] https://blog.csdn.net/wu_lai_314/article/details/8374905
[2] https://zhidao.baidu.com/question/569840007.html