C++ winsock2发送和接收
我搜索了论坛,但找不到我的问题的正确答案。我将在程序中做一个小日志,所以我希望将数据作为登录名发送到编辑框中,然后将数据作为密码发送到第二个编辑框中C++ winsock2发送和接收,c++,send,winsock2,C++,Send,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
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?
int dt=recv(SocketM[i],
串,
128,
0);
int errsock=WSAGetLastError();
if(errsock!=WSAEWOULDBLOCK&&errsock!=0)
{
TCP是一种字节流协议。如果您想分离消息,则可以通过分隔符、长度字前缀、自描述协议(如XML)、类型-长度-值协议等来实现
注意:除非出现错误,否则检查WSAGetLastError()
是无效的:即在本例中,如果recv()
返回-1。在检查错误代码之前调用其他API函数,如Sleep
,也不是一个好主意。如果您不希望所有数据都在一个recv()
,为什么要请求长度为128?有没有办法在服务器端获取我的缓冲区长度?recv函数在第三个参数中请求缓冲区长度,但我如何设置它?发送方知道缓冲区长度,接收方需要它。有两种方法。选项1——固定长度消息,填充占据未使用的部分(但要小心用零或其他东西填充填充,不要在其中留下随机数据。请参阅“Heartbleed”了解这一点的重要性)。选项2——在数据之前发送长度(EJP在回答中提到了长度前缀)。在选项2中,长度本身是固定大小的,因此问题不会再次出现。