这是我的代码:
#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;
这里有两个大问题:
您没有检查
recv
是否成功,因此CONVERTER
可能包含数据或垃圾。您忽略
SUCCESSFUL
,它包含您收到的字节数。所以赋值操作不知道MESSAGE
中有多少数据或要复制多少字节。
基本问题是您未能实现任何类型的协议(protocol)。 TCP是字节流协议(protocol),不是消息协议(protocol)。如果要实现消息,则必须定义并实现消息协议(protocol)。您期望它能神奇地工作。
有一条古老的程序员规则——在记住这句话并能准确解释其含义之前,没有人可以编写任何使用 TCP 的软件,“TCP 是一种可靠的字节流协议(protocol),不保留应用程序消息边界".
关于c++ - 我用 winsock2 在 C++ 中做了一个简单的套接字,我把 recv 函数放到一个变量中,它给出了一些奇怪的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31822263/