使用 TCP 从两台不同的客户端计算机向服务器发送数据

时间:2021-07-13 10:07:04

标签: python c sockets tcp client-server

我在两台运行相同硬件/软件/操作系统的机器上设置了客户端/服务器。通信是使用 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);

1 个答案:

答案 0 :(得分:0)

我觉得自己很愚蠢。我发现了问题。似乎我的搭档用一些标题包装了数据而忘记通知我。他在这个header里加了一个“type”字段,消息被master收到了,类型非法!

对不起,给您添麻烦了。 quamrana 你是对的。

相关问题