我在两台运行相同硬件/软件/操作系统的机器上设置了客户端/服务器。通信是使用 TCP 完成的。 服务器接收传入流量并成功解析。我可以在我的日志 (DB) 中看到它。 消息是使用 C 代码发送的。
现在我尝试从具有不同硬件/软件/操作系统的不同机器发送相同的数据。服务器收到传入的数据包,但无法解析它们(我的软件无法解析它们),我在日志中看不到它。 消息是使用简单的 python 代码发送的:
import socket
TCP_IP = '10.1.10.121'
TCP_PORT = 8888
MESSAGE1 = '004a0d09fedcba04100f672d0904badcfe08f072f0720d0200e1b40000000044e90e0c520600cb2067e311016e719e0300000000eb2a6bbb9257d61374634ec0000000000000090d'.decode('hex')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
#s.send(MESSAGE1)
s.sendto(MESSAGE1, ('10.1.10.121',8888))
s.close()
我捕获了两个数据包,一个由不同但相同类型的机器发送,第二个由完全不同的机器发送。
由相同类型的机器、客户端发送:
10:30:15.041752 IP 10.1.10.114.60960 > 10.1.10.121.8888: Flags [P.], seq 72:144, ack 1, win 1002, options [nop,nop,TS val 2335115935 ecr 3243788988], length 72
0x0000: 4500 007c bb72 4000 4006 561d 0a01 0a72 E..|.r@.@.V....r
0x0010: 0a01 0a79 ee20 22b8 4756 ac42 f082 5712 ...y..".GV.B..W.
0x0020: 8018 03ea 295b 0000 0101 080a 8b2f 0a9f ....)[......./..
0x0030: c158 4abc 004a 0d09 fedc ba04 100f 672d .XJ..J........g-
0x0040: 0904 badc fe08 f072 f072 0d02 00e1 b400 .......r.r......
0x0050: 0000 0044 e90e 0c52 0600 cb20 67e3 1101 ...D...R....g...
0x0060: 6e71 9e03 0000 0000 eb2a 6bbb 9257 d613 nq.......*k..W..
0x0070: 7463 4ec0 0000 0000 0000 090d tcN.........
由不同类型的机器发送:
04:59:50.496408 IP 10.1.1.26.50282 > 10.1.10.121.8888: Flags [P.], seq 1:73, ack 1, win 229, options [nop,nop,TS val 517330441 ecr 1079241846], length 72
0x0000: 4500 007c d474 4000 4006 4673 0a01 011a E..|.t@.@.Fs....
0x0010: 0a01 0a79 c46a 22b8 9f09 027c 8b0d 3d1a ...y.j"....|..=.
0x0020: 8018 00e5 69b4 0000 0101 080a 1ed5 d609 ....i...........
0x0030: 4053 ec76 004a 0d09 fedc ba04 100f 672d @S.v.J........g-
0x0040: 0904 badc fe08 f072 f072 0d02 00e1 b400 .......r.r......
0x0050: 0000 0044 e90e 0c52 0600 cb20 67e3 1101 ...D...R....g...
0x0060: 6e71 9e03 0000 0000 eb2a 6bbb 9257 d613 nq.......*k..W..
0x0070: 7463 4ec0 0000 0000 0000 090d tcN.........
服务器正在使用 select 侦听套接字列表。我没有实现代码,但从我看来,这是处理来自客户端的传入流量的分支。我将尝试在代码中添加一些打印行,看看它是否到达这行代码。 服务器代码:
if (((cc_handler_das_msg_t *)buffer)->type == CC_HANDLER_DAS_MSG_TYPE_DATA) {
*(uint32_t *)(&((cc_handler_das_msg_t *)buffer)->data+SW_FIFO_DATA_BUFF_SIZE*4)=i;
write(message_net2iot_fifo_fd,&((cc_handler_das_msg_t *)buffer)->data,((cc_handler_das_msg_t *)buffer)->length/*valread*/);
cc_handler_das_slave_data[i].ul_packets++;
//printf("Master send message to iot\n");
} else if (((cc_handler_das_msg_t *)buffer)->type == CC_HANDLER_DAS_MSG_TYPE_KEEP_ALIVE) {
cc_handler_das_slave_data[i].keep_alive++;
((cc_handler_das_msg_t *)message_buff)->type = CC_HANDLER_DAS_MSG_TYPE_KEEP_ALIVE;
((cc_handler_das_msg_t *)message_buff)->length = 0;
send(sd , message_buff , sizeof(cc_handler_das_msg_t)-sizeof(uint8_t) , 0 );
time(&cc_handler_das_slave_data[i].last_sent);
}
time(&cc_handler_das_slave_data[i].last_seen);
答案 0 :(得分:0)
我觉得自己很愚蠢。我发现了问题。似乎我的搭档用一些标题包装了数据而忘记通知我。他在这个header里加了一个“type”字段,消息被master收到了,类型非法!
对不起,给您添麻烦了。 quamrana 你是对的。