c++ socket端口混乱
最近在写web服务器的时候突然碰到了一个问题,就是在使用c++ socket的时候在浏览器上突然不能连接,想到前几天Xcode刚刚更新,还以为是Xcode导致clang出现问题。
进行调试的时候还以为是多路复用IO出了问题(因为调试的时候停在那里),后来才发现是因为没有收到连接请求。
于是非常苦恼。
万幸的是我遇到了Vs code这个神级编辑器。
写了个小程序进行测试,其实就是个最简单的server程序。然后用下面的程序进行测试,输出socket绑定的ip和端口(这个小程序也有点问题,输出的端口是网络字节序)
sockaddr_in tmp;
socklen_t ilen=sizeof(tmp);
getsockname(sockfd,(struct sockaddr*)&tmp,&ilen);
char *ip=inet_ntoa(tmp.sin_addr);
int port=(int)tmp.sin_port;
printf("%s:%d\n",ip,port);
发现每次输出的端口都是乱的
这才意识到可能是bind函数出现了问题。
幸亏有vscode,向我提示了函数的原型,意识到有点不大对劲
这才意识到调用了std::bind,而这个函数的功能是和我们要调用的socket中的bind是不一样的
想要调用socket中的bind,方法有两个:
- 不使用
using namespace std;
- 在
bind
前加上::
至此,问题完美解决。