使用 TCP 从两台不同的客户端机器向服务器发送数据 [关闭]

Posted

技术标签:

【中文标题】使用 TCP 从两台不同的客户端机器向服务器发送数据 [关闭]【英文标题】:Sending data to server using TCP from two different client machines [closed] 【发布时间】:2021-09-22 09:19:21 【问题描述】:

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

【问题讨论】:

消息MESSAGE1 出现在两个日志中,从偏移量0x0034 开始,即:004a 0d09 .. 请发布您的解析代码,以便我们检查 嗨。也许我将您与“日志”一词混淆了。我的服务器在收到数据包后假设将其传递给解析它并将其存储在数据库中的某个线程。你是对的,我捕获的两个数据包都有相同的数据,但只有一个(第一个)显示在数据库中。 另请注意,客户端端口号位于偏移量0x0014 处,显然在两种情况下都不同。因此,您似乎已经记录了一个数据包,其中包含标头信息以及消息的正文。 是的。我使用 tcpdump 记录了完整的数据包。我将相关的服务器代码复制到我的原始帖子消息中 【参考方案1】:

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

很抱歉给您带来了困扰。 quamrana 你是对的。

【讨论】:

以上是关于使用 TCP 从两台不同的客户端机器向服务器发送数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

TCP通信的客户端代码实现,TCP通信的服务端代码实现

将主机名解析为 IP 地址

TCP协议与TCP通信

如何使用 Perl 通过 TCP 和 UDP 连接到远程机器?

Java TCP 打孔

TCP / IP在两台计算机之间发送数据?