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

Posted

技术标签:

【中文标题】我用winsock2在C++中做了一个简单的套接字,我把recv函数放入一个变量中,它给出了一些奇怪的符号【英文标题】:I made a simple socket in C++ with winsock2 and I put the recv function into a variable and it's giving some weird symbols 【发布时间】:2015-08-05 02:06:34 【问题描述】:

这是我的代码:

 #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

【问题讨论】:

【参考方案1】:
    SUCCESSFUL = recv(sock, MESSAGE, sizeof(MESSAGE), MSG_PEEK);

    CONVERTER = MESSAGE;

这里有两个大问题:

    你不检查recv是否成功,所以CONVERTER可能包含数据或垃圾。

    您忽略了SUCCESSFUL,它保存了您收到的字节数。所以赋值操作不知道MESSAGE中有多少数据,也不知道要复制多少字节。

基本问题是您未能实现任何类型的协议。 TCP 是字节流协议,而不是消息协议。如果要实现消息,则必须定义并实现消息协议。你期待它通过魔法发挥作用。

有一条老程序员的规则——在他们记住这句话并能准确解释它的含义之前,任何人都不能编写任何使用 TCP 做任何事情的软件,“TCP 是一种可靠的字节流协议,它不保留应用程序消息边界”。

【讨论】:

非常感谢! :) 看来我无法解释我会坚持下去。

以上是关于我用winsock2在C++中做了一个简单的套接字,我把recv函数放入一个变量中,它给出了一些奇怪的符号的主要内容,如果未能解决你的问题,请参考以下文章

C++ WinSock2:连接()调用上的 WSA_INVALID_HANDLE

C++ Windows 套接字 - 在程序退出时关闭套接字

C++ WinSock 2 - 使用 getpeername() 函数时套接字崩溃

WebSocket客户端和WinSock2服务器,可以吗?

VC++ Winsock2 错误 10049。尝试构建 IRC 机器人

如何在C中正确链接winsock2.h? [复制]