gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:13:33 24 4
gpt4 key购买 nike

这是我的代码:

 #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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com