c++ - 我用 winsock2 在 C++ 中做了一个简单的套接字,我把 recv 函数放到一个变量中,它给出了一些奇怪的符号

标签 c++ websocket winsock2

这是我的代码:

 #include "CLIENT.h"

int main() {
    //Locals
    long SUCCESSFUL;
    WSAData WinSockData;
    WORD DLLVersion;
    DLLVersion = MAKEWORD(2,1);
    SUCCESSFUL = WSAStartup(DLLVersion, &WinSockData);

    string RESPONSE;
    string CONVERTER;
    char MESSAGE[200];

    SOCKADDR_IN ADDRESS;

    SOCKET sock;
    sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    ADDRESS.sin_addr.s_addr = inet_addr("173.194.219.93");
    ADDRESS.sin_family = AF_INET;
    ADDRESS.sin_port = htons(443);

    cout << "\n\tCLIENT: Do you want to connect to this SERVER? (Y/N)" << endl;
    cin >> RESPONSE;

    RESPONSE[0] = tolower(RESPONSE[0]);

    if(RESPONSE == "n") {
        cout << "\n\tOK. Quitting." << endl;
    }
    else if(RESPONSE == "y") {
        connect(sock, (SOCKADDR*)&ADDRESS, sizeof(ADDRESS));

        SUCCESSFUL = recv(sock, MESSAGE, sizeof(MESSAGE), MSG_PEEK);

        CONVERTER = MESSAGE;

        cout << "\n\tMessage from SERVER:\n\n\t" << CONVERTER << endl;
    }
    else {
        cout << "That was an inappropriate RESPONSE!" << endl;
    }

    cout << "\n\n\tMSG_PEEK'd data: " << SUCCESSFUL << endl;
    system("PAUSE");
    return 0;

}

这就是它给我的: “¬◄G”当然要减去引号。 我不知道它应该是什么或意味着什么。我错过了某种转换吗? 在头文件中,我只包含 winsock2.h、windows.h、iostream、string 和定义的 SOCK_VERSION2 0x0202

最佳答案

    SUCCESSFUL = recv(sock, MESSAGE, sizeof(MESSAGE), MSG_PEEK);

    CONVERTER = MESSAGE;

这里有两个大问题:

  1. 您没有检查recv 是否成功,因此CONVERTER 可能包含数据或垃圾。

  2. 您忽略 SUCCESSFUL,它包含您收到的字节数。所以赋值操作不知道MESSAGE中有多少数据或要复制多少字节。

基本问题是您未能实现任何类型的协议(protocol)。 TCP是字节流协议(protocol),不是消息协议(protocol)。如果要实现消息,则必须定义并实现消息协议(protocol)。您期望它能神奇地工作。

有一条古老的程序员规则——在记住这句话并能准确解释其含义之前,没有人可以编写任何使用 TCP 的软件,“TCP 是一种可靠的字节流协议(protocol),不保留应用程序消息边界".

关于c++ - 我用 winsock2 在 C++ 中做了一个简单的套接字,我把 recv 函数放到一个变量中,它给出了一些奇怪的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31822263/

相关文章:

Python Socket 编程 简单的 Web 服务器

c++ - 如何使用 winsock2 应用 Linger 选项

c++ - 如果winsock2套接字是非阻塞的,与其关联的SSL对象是否也会表现出非阻塞行为?

c++ - 在 C++ 中写入用户指定的文件

c++ - GCC/G++ 编译器设置 GUI

javascript - io.sockets.emit 有效但 io.sockets.on 无效

node.js - WebSocket 连接建立错误:net::ERR_CONNECTION_CLOSED

在 C 中将字节转换为 uint32

c++ - 1 个线程工作但导致调用方法不返回的线程问题

C++ 声明一个变量两次