缓冲流数据

时间:2010-05-14 15:46:01

标签: c linux sockets

我正在尝试开发一个简单的IRC机器人。首先,我想为这个项目考虑一个合适的设计。我现在想知道的一件事是读机制。我在Linux系统上开发这个机器人。 (Fedora 12)要从套接字读取,我使用系统调用“read()”。我计划以下列方式使用阅读功能(代码只是一个例子。不是最终产品的东西):

while (uBytesRead = read(iServerSocket, caBuffer, MAX_MESSAGE_SIZE))
{
   //1. Parse the buffer and place it into a Message structure.
   //2. Add the message structure to a linked list that will act as a queue of message that are to be processed.
}

此代码将在其自己的线程中运行。我选择这个选项是因为我希望尽可能减少读取之间的延迟。 (写入将以相同的方式实现)这都是基于假设,我想清理。我的问题是:如果你以如此快的速度收到如此多的数据,那么读取和处理数据(在这种情况下只是解析数据)会比数据进入的速度慢得多。我假设这个数据将由系统缓冲。这是一个正确的假设吗?如果是这样的话:

  1. 这个缓冲区有多大?
  2. 当此缓冲区已满时,将数据包含在内会发生什么?
  3. 为了使我的应用程序免受垃圾邮件的侵害,我怎么能最好地处理它?<​​/ li>

    我希望我已经清楚地解释了我的问题。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

IRC使用TCP套接字进行联网。 Linux / Posix TCP套接字有一个用于发送的数据缓冲区和另一个用于接收的数据缓冲区。您可以使用setsockopt()和SO_SNDBUF / SO_RCVBUF来调整缓冲区的大小。

TCP具有流量控制,因此当接收缓冲区变满时,操作系统将发送拥塞通知。接收方不会确认收到的不适合缓冲区的数据包,最终将由发送方重新发送。

所以这不用担心。重要的是当套接字的发送缓冲区满了时发送方编程是什么。有些程序将关闭套接字,其他程序只会丢弃写入的数据并重试,而其他程序可能会在内部缓冲。