Winsock中accept函数获取到的ip地址一直为204.204.204.204或0xcccccccc的解决方案

出现问题的原因

我这边出现问题的代码如下:

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

猜你喜欢

转载自blog.csdn.net/weixin_52027058/article/details/127200464