Receiving data from Java-Client (data contains int, short, string)

对着背影说爱祢 提交于 2019-11-28 14:25:16
alk

You need to create a generic "read_n_bytes" function.

This you can use to read the message-size, the operation and the text, in three successive calls.

Those three calls you then wrap in a function to be called to read an entire message.


A generic reader might look like this:

/*
 * Reads n bytes from sd into where p points to.
 *
 * returns 0 on succes or -1 on error.
 *
 * Note: 
 * The function's name is inspired by and dedicated to "W. Richard Stevens" (RIP).
 */
int readn(int sd, void * p, size_t n)
{
  size_t bytes_to_read = n;
  size_t bytes_read = 0;

  while (bytes_to_read > bytes_read)
  {
    ssize_t result = read(sd, p + bytes_read, bytes_to_read);
    if (-1 == result)
    {
      if ((EAGAIN == errno) || (EWOULDBLOCK == errno))
      {
        continue;
      }

#     ifdef DEBUG     
      {
        int errno_save = errno;
        perror("read() failed");
        errno = errno_save;
      }
#     endif

      break;
    }
    else if(0 == result)
    {
#     ifdef DEBUG
      {     
        int errno_save = errno;
        fprintf(stderr, "%s: Connection closed by peer.", __FUNCTION__);
        errno = errno_save;
      }
#     endif

      break;
    }

    bytes_to_read -= result;
    bytes_read += result;
  }

  return (bytes_read < bytes_to_read) ?-1 :0; 
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!