管他什么真理无穷,进一寸有一寸的欢喜
使用wireshark查找socket连失败
在实现《TCP/IP网络编程》第5章的计算器服务器端/客户端示例
时,服务器端和客户端代码都已经实现好了,相关代码如下.根据代码,当客户端连上服务器时,服务器端会打印Connected...
字符串, 客户端会打印Operand count:
提示输入相关信息.但是当运行的时候发现服务器端和客户端都没有打印相关信息, 服务器端和客户端一直在阻塞,也没有提示相关错误.大概两分钟后,客户端提示connect() error.
找了好久的原因也没找到(缺少错误信息提示), 于是就想着使用wireshark
抓包分析一下, 没想到一抓包就找到了问题.
根据抓包信息,可以发现客户端发出的SYN
数据段一直在超时重传.也就是服务器端一直收不到客户端的连接请求.再看Destination
列发现, 客户端指定的服务IP居然是1.0.0.127
, 很明显是客户端在网络地址初始化时出现了错误.查看客户端网络地址初始化的代码(如下):
// init network address
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(inet_addr(argv[1]));
server_addr.sin_port = htons(atoi(argv[2]));
client_sock = socket(PF_INET, SOCK_STREAM, 0);
与IP地址相关的是第4行代码, 运行时输入的是127.0.0.1
,为什么会变成1.0.0.127
了呢?这个与CPU在内存中保存数据的方式有关.
字节序与网络字节序
CPU向内存中保存数据有两种方式:
-
大端序: 高位字节存放在低位地址(最高有效位对应实际地址)