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中,长度本身是固定大小的,因此问题不会再次出现。