【发布时间】:2014-05-04 22:25:39
【问题描述】:
我搜索了论坛,但找不到我的问题的正确答案。我将做一个小的登录程序,所以我想将编辑框中的数据作为登录名发送,然后将第二个编辑框中的数据作为密码发送。
int ldata2 = send(Socket, buffs, len, 0);//send login via socket
//send pass via socket
int passData = send(Socket, buffPass, lenPass, 0);
以上说明由客户在场外处理。当我调用 recv 时在服务器端,即这样:
int dt = recv(SocketM[i],
strings,
128,
0);
int errsock = WSAGetLastError();
if(errsock != WSAEWOULDBLOCK && errsock != 0)
{
std::cout << "ERR CODE " << errsock;
//shutdown(SocketM[Client]);
closesocket(SocketM[Client]);
break;
}
int passdt = recv(SocketM[i],
passstrings,
128,
0);
std::cout << strings << std::endl;//Log and Password in the same buff :(
std::cout << passstrings //nothing in buffer why?
我从 buffs 中获取值字符串数据和从 buffPass 中获取数据,而不是仅从 buffs 中获取例如:如果在登录编辑框中是“Log”并且在 Pass 编辑框中-“Pass”我得到 LogPass 但我想将日志中的数据分开到一个字符串,并将数据从传递到第二个。请帮我 请帮我。
【问题讨论】:
-
如果你不想把所有数据都放在一个
recv()里,那你为什么要求长度为128? -
有没有办法在服务器端获取我的缓冲区长度? recv 函数在第三个参数中请求缓冲区长度,但我该如何设置它?
-
发送方知道缓冲区长度,接收方需要它。有两种方法可以做到这一点。选项 1 - 固定长度的消息,填充占用未使用的部分(但要小心用零或其他内容填充填充,不要在其中留下随机数据。请参阅“Heartbleed”了解为什么这很重要)。选项 2——在数据之前发送长度(EJP 在他的回答中提到了长度前缀)。在选项 #2 中,长度本身是固定大小的,因此问题不会递归。