c ++ socket recv函数循环 [英] c++ socket recv function loop

查看:102
本文介绍了c ++ socket recv函数循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在tcp套接字上发送和接收2个数据.协议写在下面.

Im trying to send and receive 2 data back to back on tcp socket. Protocol is written below.

  1. 客户端发送数据
  2. 在接收到服务器上的数据后,它会发回给客户端

现在使用下面的客户端代码,我无法获取第二个数据,我认为"Recv"功能做错了什么.下面是代码片段.

Now using below client code I'm not able to get 2nd data and I think the 'Recv' function doing something wrong. Below is the code snippet.

int Recv(char* buffer, int size) 
{
  int total = 0, n = 0;
  while((n = ::recv(m_hSocket, buffer+total, size-total-1, 0)) > 0) 
  {
    total += n;
  }
  buffer[total] = 0;
  return total;
}

int SendAndReceiveData()
{
  //CStringA cstData :: this data getting filled by some other code. Ignore!

  //Send data
  char chSendBuff[256];
  memset(chSendBuff, 0, sizeof(chSendBuff));
  sprintf_s(chSendBuff, sizeof(chSendBuff), "%s", (LPCTSTR)cstData);
  send(m_hSocket, chSendBuff, (int)strlen(chSendBuff), 0);

  //Read response
  char chRecvBuff[256];
  memset(chRecvBuff, 0, sizeof(chRecvBuff));
  int iRet = Recv(chRecvBuff, 256);
}

推荐答案

您的接收函数应如下所示:

Your receive function should look like this:

int receive(int sockfd, void *buf, size_t len, int flags)
{
    size_t toread = len;
    char  *bufptr = (char*) buf;

    while (toread > 0)
    {
        ssize_t rsz = recv(sockfd, bufptr, toread, flags);
        if (rsz <= 0)
            return rsz;  /* Error or other end closed connection */

        toread -= rsz;  /* Read less next time */
        bufptr += rsz;  /* Next buffer position to read into */
    }

    return len;
}

这篇关于c ++ socket recv函数循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆