繁体   English   中英

如何从 python 服务器正确发送消息到 c++ 客户端?

[英]How to send messages properly from python server to c++ client?

我有一个 python 服务器在以下代码上运行:

import socket
ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.bind(('0.0.0.0',8080))
ss.listen(5)
cs,adr=ss.accept()
print("Got a connection from:"+str(adr))
while 1:
    msg=input('Enter your message:')
    cs.send(msg.encode('ascii'))
cs.close()

对于客户端,我使用的是 C++。
客户端.h:

#include<WinSock2.h>
#include<WS2tcpip.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
class client {
private:
    const char* IP;
    int PORT;
    SOCKET sock;
public:
    client(char* ip, int port){
        IP = ip;
        PORT = port;
    }
    void createSession();//Creates socket and connects with the server.
    void sendData(char* message);//Sends message to the server, it works fine
    char* receive()
    {
        char message[2000];
        if (recv(sock, message, 2000, 0) == SOCKET_ERROR)
        {
            WSACleanup();
            return (char*)"Failed to receive Message";
        }
        return message;
    }
};

客户端.cpp:

#include"client.h"
#include<iostream>
#define IP "127.0.0.1"
#define port 8080
using namespace std;
int main()
{
    client c1((char*)IP, port);
    c1.createSession();
    while (1)
    {
        char* message;
        message = c1.receive();
        cout << IP << ':' << port << " Says: " << message << endl;
    }
    return 0;
}

但我收到的信息是垃圾。 我猜这是一个转换错误,因为对于 python 客户端,我会在接收时首先使用recv(length).decode('ascii')来解码消息。 我该如何解决?

char* receive()
{
    char message[2000];
    if (recv(sock, message, 2000, 0) == SOCKET_ERROR)
    {
        WSACleanup();
        return (char*)"Failed to receive Message";
    }
    return message;
}
...
message = c1.receive();
cout << IP << ':' << port << " Says: " << message << endl;

这在多个地方都是错误的:

  • 您正在将数据读入分配在 function 堆栈( message[2000] )上的缓冲区中。 该缓冲区将在函数退出后自动释放,因此您从 function 返回的内容不再存在。
  • 打印时,您将消息视为\0终止的 char[] ,即使它不是\0终止的。 这意味着接收消息之后的垃圾将被打印,直到找到\0为止。 很可能在缓冲区中找不到\0 ,在这种情况下它将继续读取,可能在分配的 memory 之外并因此崩溃。
  • 您假设 Python 中的send将发送完整消息,但这不能保证。 检查send的返回值,了解实际发送了多少或使用sendall
  • 您假设 C 中的recv将收到完整的消息,但这不能保证。 TCP 没有消息的概念, recv只会返回已经收到的字节。 特别是对于大消息或小消息 TCP windows 这可能不是您想要的完整消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM