64,281
社区成员
发帖
与我相关
我的任务
分享
void RZAgent::RecvPeerData(WAIT_MODE _eWaitMode /* = ENUM_SYN */)
{
pNetConn->WaitForPeerResponse(_eWaitMode);
pNetConn->RecvDataFromPeer();
}
::select(maxFd+1, &readySet, NULL, NULL, ptv)
80 C8 00 06 40 A5 8C 19 D7 5E 18 68 52 2D 0E 56 ....@... .^.hR-.V
6A 9F AA 5F 00 00 00 01 00 00 00 26 81 CA 00 06 j.._.... ...&....
40 A5 8C 19 01 0E 51 54 53 53 31 34 30 34 32 37 @.....QT SS140427
39 32 37 32 00 00 00 00 81 CC 00 06 40 A5 8C 19 9272.... ....@...
71 74 73 69 00 00 00 00 00 00 00 02 61 74 00 04 qtsi.... ....at..
00 00 00 14
int i;
::memset(rBuffer, 0, ulBufSize);
#ifdef WIN32
if ((i = ::recvfrom(iSockFile, rBuffer, ulBufSize, 0,
(sockaddr*)&lPeerAddr, &iSize) == SOCKET_ERROR))
Log::ERR("Platform SDK \'recvfrom\' called failed.\tError Code: %d\n", WSAGetLastError());
#endif
printf("The number of received bytes is %d, %s\n", i, rBuffer);
不知道为什么i总是打印出了0,但是rBuffer还是能够正常显示接收到的数据
我把printf放到recv函数调用处,结果能够正常返回接到的字节数,你能帮我看下问题出在哪吗,谢谢
std::string RZUdpConn::RecvDataFromPeer()
{
if (!SocketValid())
Log::ERR("Can not receive data, Please BuildConnection first.\n");
::memset(rBuffer, 0, ulBufSize);
#ifdef WIN32
struct sockaddr_in lPeerAddr;
::memset(&lPeerAddr, 0, sizeof(sockaddr_in));
int iSize = sizeof(lPeerAddr);
if (::recvfrom(iSockFile, rBuffer, ulBufSize, 0,
(sockaddr*)&lPeerAddr, &iSize) == SOCKET_ERROR)
Log::ERR("Platform SDK \'recvfrom\' called failed.\tError Code: %d\n", WSAGetLastError());
#endif
return std::string(rBuffer);
}
就是简单的对recvfrom的封装,没看出有什么问题啊
之前搜了许多资料,知道在收udp包时,如果物理层校验通过,发现数据传输未出错,那么会传给IP层,否则就是整包丢弃。所以recvfrom调用要么收不到,要么收到一个完整的,而上面这种情况根本不会出现。但打印调试信息,发现确实收不全,我也是无奈了。
本来要做一下解析的,因为收到的包含有8个字节的头部,如果少于8个字节说明包的格式不正确,就会直接丢弃,现在在每次调用返回2个字节,根本不做解析就直接丢弃,在解析模块里下了断点,完全不会陷进去。[/quote]
buf不一定是字符串, 不能直接std::string(buf),试试std::vector<char>ssize_t recvfrom(int socket, void *restrict buffer, size_t length,
int flags, struct sockaddr *restrict address,
socklen_t *restrict address_len);
std::string RZUdpConn::RecvDataFromPeer()
{
if (!SocketValid())
Log::ERR("Can not receive data, Please BuildConnection first.\n");
::memset(rBuffer, 0, ulBufSize);
#ifdef WIN32
struct sockaddr_in lPeerAddr;
::memset(&lPeerAddr, 0, sizeof(sockaddr_in));
int iSize = sizeof(lPeerAddr);
if (::recvfrom(iSockFile, rBuffer, ulBufSize, 0,
(sockaddr*)&lPeerAddr, &iSize) == SOCKET_ERROR)
Log::ERR("Platform SDK \'recvfrom\' called failed.\tError Code: %d\n", WSAGetLastError());
#endif
return std::string(rBuffer);
}
就是简单的对recvfrom的封装,没看出有什么问题啊
之前搜了许多资料,知道在收udp包时,如果物理层校验通过,发现数据传输未出错,那么会传给IP层,否则就是整包丢弃。所以recvfrom调用要么收不到,要么收到一个完整的,而上面这种情况根本不会出现。但打印调试信息,发现确实收不全,我也是无奈了。
本来要做一下解析的,因为收到的包含有8个字节的头部,如果少于8个字节说明包的格式不正确,就会直接丢弃,现在在每次调用返回2个字节,根本不做解析就直接丢弃,在解析模块里下了断点,完全不会陷进去。