首页 > 解决方案 > python socket客户端不发送任何东西

问题描述

我正在尝试通过 HTTP 套接字进行集成。我正在使用 python 创建套接字客户端并将数据发送到用 C 创建的套接字服务器。

正如您在下图中看到的那样,集成文档提供了一个 C 语言示例,显示了我必须如何将数据发送到服务器:

集成文档示例:

1-为消息头和每种消息格式定义记录/结构类型

2-声明/创建一个客户端套接字对象

3-以非阻塞模式打开套接字组件

4-声明一个与您希望调用的 API 函数相关的数据结构类型的变量——然后用正确的数据(包括标题)填充它。将结构体数据复制到字节数组中,通过socket发送

我尝试使用 python 中的 ctypes 模块来做到这一点:

class SPMSifHdr(ctypes.Structure):
    _fields_ = [
        ('ui32Synch1', ctypes.c_uint32),
        ('ui32Synch2', ctypes.c_uint32),
        ('ui16Version', ctypes.c_uint16),
        ('ui32Cmd', ctypes.c_uint32),
        ('ui32BodySize', ctypes.c_uint32)
    ]

class SPMSifRegisterMsg(ctypes.Structure):
    _fields_ = [
        ('hdr1', SPMSifHdr),
        ('szLisence', ctypes.c_char*20),
        ('szApplName', ctypes.c_char*20),
        ('nRet', ctypes.c_int)
    ]

body_len = ctypes.sizeof(SPMSifRegisterMsg)
header = SPMSifHdr(ui32Synch1=0x55555555, ui32Synch2=0xaaaaaaaa, ui16Version=1, ui32Cmd=1, ui32BodySize=body_len)
body = SPMSifRegisterMsg(hdr1=header, szLisence='12345', szApplName='MyPmsTest', nRet=1)

socket_connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# config is a dict with the socket server connection params
socket_connection.connect((config.get('ip'), int(config.get('port'))))

socket_connection.sendall(bytearray(body))
socket_connection.recv(1024)

当我调用 socket recv 函数时,它从来没有收到任何东西,所以我使用了一个 Windows 工具来检查我发送的数据,正如你在下一张图片中看到的那样,似乎发送了任何数据: Socket sniff

我什至尝试发送一个简单的“Hello!world”字符串,结果总是一样的。

套接字连接已打开。我知道,因为我可以看到从服务器面板打开了多少连接。

我究竟做错了什么?

标签: python-2.7sockets

解决方案


错误是 SocketSniff 程序仅在服务器返回响应时才显示发送的数据。在这种情况下,服务器永远不会返回任何内容,因为缺少一些字节。

我发现它创建了我自己的套接字回显服务器并检查我发送的数据是否不完整。

谜团已揭开。:D


推荐阅读