【发布时间】:2018-07-29 19:06:33
【问题描述】:
我一直在尝试使用套接字将数组从 Python 发送到 C++,但一直遇到问题。
Python 方面存在直接发送数组的问题,例如 pickle 与 C++ 不兼容,因此我发现的唯一半可靠方法是将其作为字符串发送:
import socket
import sys
import random
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 5555)
print >>sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)
# Message to be sent to C++
# message = [random.randint(1, 10),random.randint(1, 10),random.randint(1, 10)]
i = 0
while i < 5:
a_converted = (random.randint(1,255), random.randint(1,255), random.randint(1,255))
#a_converted = 'words'
print a_converted
# Sending message to C++
sock.sendall(str(a_converted))
i += 1
sock.close()
将它作为字符串发送的问题是我实际上需要它作为另一端的双样式数组。我目前拥有的 C++ 代码如下:
#include "stdafx.h"
#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h> //for SOCKET communication
#include <sstream>
#include <stdlib.h>
//Linking Ws2_32.lib, Mswsock.lib, Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
#pragma warning(disable:4996)//to disable warning message
using namespace std;
int main()
{
WSADATA WSAData;
SOCKET server, client;
SOCKADDR_IN serverAddr, clientAddr;
WSAStartup(MAKEWORD(2, 0), &WSAData);
server = socket(AF_INET, SOCK_STREAM, 0);
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(5555);
::bind(server, (SOCKADDR *)&serverAddr, sizeof(serverAddr));
listen(server, 0);
cout << "Listening for incoming connections..." << endl;
string a_converted[1000];
int clientAddrSize = sizeof(clientAddr);
if ((client = accept(server, (SOCKADDR *)&clientAddr, &clientAddrSize)) != INVALID_SOCKET)
{
cout << "Client connected!" << endl;
// Loop
int i = 0;
while (i<5) {
recv(client, (char*)a_converted, sizeof(a_converted), 0);
char char_array[sizeof(a_converted)];
strcpy(char_array, (char*)a_converted);
memset(a_converted, 0, sizeof(a_converted));
cout << "Client says: " << char_array << endl;
cout << endl;
i = i++;
}
closesocket(client);
WSACleanup();
cout << "Client disconnected." << endl;
}
cout << "Press Enter to continue" << endl;
getchar();
}
信息已收到且正确,但我无法正确转换数据。我曾尝试使用 atof 和类似的函数在 C++ 端进行转换,但是 Python 端的逗号和括号的存在似乎导致它出错并给出零,而且我试图从字符串中删除它们几乎没有运气。
我不禁认为必须有更好的方法来做到这一点,但我对编码真的很陌生,所以如果我忽略了某些东西,我不会感到惊讶。 我希望能解释一下如何直接发送 C++ 可以从 Python 读取的数组,或者如何转换它在 C++ 中发送的字符串。
【问题讨论】:
-
为什么不对序列化数据使用一些标准格式,比如 JSON? Pickle 当然不适用于您的情况,因为它是特定于 Python 的。