我用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++ WinSock 2 - 使用 getpeername() 函数时套接字崩溃