从插座阅读[英] Read from socket

本文是小编为大家收集整理的关于从插座阅读的处理方法,想解了从插座阅读的问题怎么解决?从插座阅读问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我需要使用c的函数read从c的缓冲区读取,但我不知道缓冲区大小.

我认为最好的方法是读取N字节,直到读取返回0(在套接字中没有更多的编写器).它是否正确?有没有办法猜测正在套接字上写入的缓冲区的大小?

我认为套接字是一个特殊文件.以二进制模式打开文件并获得大小将帮助我知道正确的大小给缓冲区?

我是一个非常新的c,所以请记住这一点.

推荐答案

在常见的方式是使用ioctl(..)来查询套接字的FIONREAD,该套接字将返回多少数据.

int len = 0;
ioctl(sock, FIONREAD, &len);
if (len > 0) {
  len = read(sock, buffer, len);
}

其他推荐答案

从套接字中读取未知量的方式,同时避免阻塞可能是轮询()用于数据的非阻塞套接字.

e.g.

char buffer[1024];
int ptr = 0;
ssize_t rc;

struct pollfd fd = {
   .fd = sock,
   .events = POLLIN
};

poll(&fd, 1, 0); // Doesn't wait for data to arrive.
while ( fd.revents & POLLIN )
{
   rc = read(sock, buffer + ptr, sizeof(buffer) - ptr);

   if ( rc <= 0 )
      break;

   ptr += rc;
   poll(&fd, 1, 0);
}

printf("Read %d bytes from sock.\n", ptr); 

其他推荐答案

我认为最好的方法是读n 直到读取返回0(否 套接字中的更多作家).这是 正确的?

0表示EOF,其他侧已关闭连接.如果通信的其他方面关闭连接,则它是正确的.

如果连接未关闭(在相同的连接,聊天协议上的多个传输),那么情况会更复杂,行为通常取决于您是否有Sock_Stream或Sock_dram套接字.

数据报套接字由操作系统为您分隔.

流套接字不分隔消息(所有数据是不透明字节流),如果需要一个必须在应用程序级别实现该级别:例如,通过在消息标题结构中定义大小字段或使用分隔符(例如'\ n'用于单行短信).在第一次案例中,您将首先读取标题,提取长度并使用长度读取消息的其余部分.在其他情况下,读入部分缓冲区,从缓冲区搜索分隔符并从缓冲区提取包括分隔符(您可能需要保留围绕协议的部分缓冲器,可以通过单个recv()/读取() ))).

有没有办法猜测 正在写入的缓冲区的大小 套接字?

对于流套接字,没有可靠的方式,因为通信的另一侧可能仍处于编写数据的过程中.想象一下,非常正常情况:套接字缓冲区是32K和128K正在写入.编写应用程序将阻止inside()/write(),等待读取应用程序的操作系统读取数据,从而为写入数据的下一块的可用空间.

对于数据报套接字,通常预先知道消息的大小.或者一个人可以尝试(从未做过自己)recvmsg(msg_peek),如果msg_trunc在返回的msghdr.msg_flags中,则尝试增加缓冲区大小.

本文地址:https://www.itbaoku.cn/post/359281.html