【问题标题】:winsock2 sending and receivingwinsock2 发送和接收
【发布时间】: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 中,长度本身是固定大小的,因此问题不会递归。

标签: c++ send winsock2


【解决方案1】:

TCP 是一种字节流协议。如果您想分隔消息,则由您决定,通过分隔符、长度字前缀、XML 等自描述协议、类型-长度-值协议……

注意检查WSAGetLastError() 是无效的,除非出现错误:即在这种情况下,如果recv() 返回-1。

【讨论】:

  • 在检查错误代码之前调用其他 API 函数(如 Sleep)也不是一个好主意。
猜你喜欢
  • 2020-10-09
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2014-06-15
  • 2016-02-22
相关资源
最近更新 更多