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 但我希望从日志单独的数据到一个字符串和数据从传递到第二。请帮我 请帮帮我。

+0

如果你不想要一个'recv()'中的所有数据,你为什么要求长度为128? –

+0

有没有办法在服务端获得我的缓冲区长度?第三个参数中的recv函数请求缓冲区长度,但我该如何设置? – ak44

+0

发送方知道缓冲区的长度,接收方需要它。两种方式来做到这一点。选项1 - 定长消息,填充占用未使用的部分(但要小心填充零填充或其他内容,不要将随机数据留在那里,请参阅“Heartbleed”以了解为什么这很重要)。选项2 - 在数据前面发送长度(EJP在他的回答中提到了长度前缀)。在选项#2中,长度本身是固定大小的,所以问题不会被缓解。 –

TCP是一种字节流协议。如果你想分开消息,你可以这样做,通过分隔符,长字前缀,自描述协议如XML,类型长度值协议......

注意它不是' t有效检查WSAGetLastError(),除非出现错误:即在此情况下,如果recv()返回-1。

+1

在检查错误代码之前调用其他API函数(如“Sleep”)也不是一个好主意。 –