winsock2发送和接收
问题描述:
我已经搜索论坛,但无法找到适合我的问题的正确答案。我要做一个小登录过程,所以我想发送数据在编辑框作为登录,然后发送数据在第二编辑框作为密码。winsock2发送和接收
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?
我从buffPass爱好者和数据,而不是仅仅从爱好者的exaple字符串值数据得到并在通过编辑框 - “通过”我得到LogPass 但我希望从日志单独的数据到一个字符串和数据从传递到第二。请帮我 请帮帮我。
答
TCP是一种字节流协议。如果你想分开消息,你可以这样做,通过分隔符,长字前缀,自描述协议如XML,类型长度值协议......
注意它不是' t有效检查WSAGetLastError()
,除非是出现错误:即在此情况下,如果recv()
返回-1。
+1
在检查错误代码之前调用其他API函数(如“Sleep”)也不是一个好主意。 –
如果你不想要一个'recv()'中的所有数据,你为什么要求长度为128? –
有没有办法在服务端获得我的缓冲区长度?第三个参数中的recv函数请求缓冲区长度,但我该如何设置? – ak44
发送方知道缓冲区的长度,接收方需要它。两种方式来做到这一点。选项1 - 定长消息,填充占用未使用的部分(但要小心填充零填充或其他内容,不要将随机数据留在那里,请参阅“Heartbleed”以了解为什么这很重要)。选项2 - 在数据前面发送长度(EJP在他的回答中提到了长度前缀)。在选项#2中,长度本身是固定大小的,所以问题不会被缓解。 –