Python Winsock - 如何通过已经处于活动状态的 Winsock 连接发送数据

Posted

技术标签:

【中文标题】Python Winsock - 如何通过已经处于活动状态的 Winsock 连接发送数据【英文标题】:Python Winsock - How to send data through an already active winsock connection 【发布时间】:2012-04-26 10:13:43 【问题描述】:

我的脚本是用大多数人不熟悉的另一种语言编写的 [MQL4],但我已将 python 功能导入到代码中,因此我可以在脚本中执行 python 代码。我的问题是,我正在使用 MQL4 连接到服务器,并且我想使用 python 通过其流发送数据。到目前为止,我只能让python创建自己的连接。无论如何要连接到已经打开的 Windows 套接字?

MQL ​​代码

void ircconnect()
int struct_sockaddr[4];
int addr, port_low, port_high;
int opts[1];
int c;

if (irc_disabled == 1) return(0);

// fill the sockaddr struct
addr = inet_addr(server_addr);
port_low = server_port & 0x00ff;
port_high = (server_port & 0xff00) >> 8; 
struct_sockaddr[0] = AF_INET | (port_high << 16) | (port_low << 24);
struct_sockaddr[1] = addr;
struct_sockaddr[2] = 0;
struct_sockaddr[3] = 0;

// connect
s = socket(AF_INET, SOCK_STREAM, 0);

opts[0] = 1000; // send timeout milliseconds
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, opts, 4);

c = connect(s, struct_sockaddr, 16);

Python 代码

//Initialize Python Dll
PyInit();
PyExecute("from Tkinter import *");
PyExecute("root = Tk()");   

//Import necessary modules
PyExecute("import socket, os");

//Connect
PyExecute("network = \"irc.ircnetwork.com\"");
PyExecute("port = 6667");
PyExecute("irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)");
PyExecute("irc.connect((network, port))");

//Identify
PyExecute("irc.recv(1024)");
PyExecute("irc.send(\\"NICK Nick\\r\\n\")");
PyExecute("irc.send(\\"USER Nick Nick Nick :Nick IRC\\r\\n\")");
PyExecute("irc.send(\\"JOIN #channel\\r\\n\")");
PyExecute("irc.send(\"PRIVMSG NickServ IDENTIFY <pass>\\r\\n\")");
PyExecute("VERSION = \"version>\\r\\n\"");

//Listen for PING
PyExecute("while True:");
PyExecute("data = irc.recv(1024)");
PyExecute("print data");
PyExecute("if data.find(\"PING\") != -1:");

//Send PONG
PyExecute("irc.send(\"PONG \" + data.split() [ 1 ] + \"\\r\\n\")");
PyExecute("elif data.find(\"VERSION\") !=-1:");
PyExecute("irc.send(VERSION + \"\\r\\n\")");
PyExecute("elif data.find(\"NOTICE\") !=-1:");
PyExecute("nick = data.split(\"\!\") [ 0 ].replace (\":\", \"\" )");
PyExecute("message = \":\".join( data.split (\":\") [ 2: ] )");

【问题讨论】:

可能感兴趣:msdn.microsoft.com/en-us/library/windows/desktop/… 谢谢。我会检查一下。 :) 仅供参考,Python 字符串也可以使用单引号,无需在代码中过多地转义双引号。 【参考方案1】:

是的。

这是可能的,也是值得推荐的。

您的 MQL 代码可以与任何交易对手“对话”——无论是 PythonjavaC#/C++php、...、Erlang、...交易对手。

不要冒着使用原始 O/S 套接字的麻烦和问题的风险,而是使用像 ZeroMQ 这样的更高抽象的方式,它具有由 Austen Conrad 移植和发布的 MQL4ZMQ 绑定,

【讨论】:

以上是关于Python Winsock - 如何通过已经处于活动状态的 Winsock 连接发送数据的主要内容,如果未能解决你的问题,请参考以下文章

如何知道一个winsock已经完成接收文件?

如何在 Winsock 中查找当前使用的 UDP 接收缓冲区大小

Excel 在VBA中可否调用winsock控件

VB6:如何获取通过 winsock 发送的字节数?

使用 vb6 winsock 发送 python 字符串

如何检查客户端是不是通过 C++ 中的 Winsock 断开连接?