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
總結
以上是生活随笔為你收集整理的Winsock中accept函数获取到的ip地址一直为204.204.204.204或0xcccccccc的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器系统共享文件,服务器操作系统文件共
- 下一篇: cf战队服务器怎么分配位置,CF:全服最