这是我第一次尝试在TCP/IP上实现某些网络协议。我设计了一个,但不确定它是否有效。
设计思路:客户端与服务器打开TCP/IP连接后,每次发送请求时,首先发送请求的大小,后跟一些分隔符(换行或空格),然后是实际请求(HTTP中使用相同的原则,并且在大多数情况下都使用此想法)。
例如,如果客户端想要发送GET ASD,它实际上会发送7 GET ASD(假设空格是分隔符)。
对于服务器端,对于每个客户端,服务器都有一个缓冲区,用于保存传入的请求。每当它从客户端获得一些新的字符块时,服务器将其附加到相应的客户端缓冲区中。之后,服务器将尝试获取请求的内容长度(在此示例中为7),并检查剩余缓冲区的长度是否大于或等于该长度。如果是,则服务器将获取请求的实际内容,进行处理并从缓冲区中删除它。
实现方面,我认为主要问题在于有效地实现和管理缓冲区。我认为具有2 * MAX_SIZE_OF_ONE_REQUEST大小的缓冲区足以为一个客户端提供服务,因为服务器接收到的块可以同时包含第一个请求的结尾和第二个请求的开头。这是我的假设,如果我错了并且我们需要更多或更少的空间,请告诉我原因。
我认为有两种方式可以在缓冲区中存储请求,直到它们被处理:
1.每当服务器接收到新的字符块时,服务器将其附加到缓冲区的右侧。一旦缓冲区包含完整的请求,服务器将处理它,并将其余的所有内容向左移动到缓冲区空间的开头。
2.一些循环缓冲区,在处理请求后不会将缓冲区移动到开头。这是我考虑异步I/O实现缓冲区时的想法(服务器将使用epoll/kqueue/select从客户端接收请求)。我认为,如果服务器不使用异步I/O与客户端通信,则实现缓冲区将更加简单。
此外,我还没有决定服务器在接收到格式错误的请求时应该如何行事。它应该关闭与客户端的连接吗?
也许我写得太多了,但我真的对这个话题很感兴趣,想尽可能多地学习。我认为像我这样的人很多,因此关于此主题的任何实际问题和解决它们的最佳实践都将非常有帮助。
设计思路:客户端与服务器打开TCP/IP连接后,每次发送请求时,首先发送请求的大小,后跟一些分隔符(换行或空格),然后是实际请求(HTTP中使用相同的原则,并且在大多数情况下都使用此想法)。
例如,如果客户端想要发送GET ASD,它实际上会发送7 GET ASD(假设空格是分隔符)。
对于服务器端,对于每个客户端,服务器都有一个缓冲区,用于保存传入的请求。每当它从客户端获得一些新的字符块时,服务器将其附加到相应的客户端缓冲区中。之后,服务器将尝试获取请求的内容长度(在此示例中为7),并检查剩余缓冲区的长度是否大于或等于该长度。如果是,则服务器将获取请求的实际内容,进行处理并从缓冲区中删除它。
实现方面,我认为主要问题在于有效地实现和管理缓冲区。我认为具有2 * MAX_SIZE_OF_ONE_REQUEST大小的缓冲区足以为一个客户端提供服务,因为服务器接收到的块可以同时包含第一个请求的结尾和第二个请求的开头。这是我的假设,如果我错了并且我们需要更多或更少的空间,请告诉我原因。
我认为有两种方式可以在缓冲区中存储请求,直到它们被处理:
1.每当服务器接收到新的字符块时,服务器将其附加到缓冲区的右侧。一旦缓冲区包含完整的请求,服务器将处理它,并将其余的所有内容向左移动到缓冲区空间的开头。
2.一些循环缓冲区,在处理请求后不会将缓冲区移动到开头。这是我考虑异步I/O实现缓冲区时的想法(服务器将使用epoll/kqueue/select从客户端接收请求)。我认为,如果服务器不使用异步I/O与客户端通信,则实现缓冲区将更加简单。
此外,我还没有决定服务器在接收到格式错误的请求时应该如何行事。它应该关闭与客户端的连接吗?
也许我写得太多了,但我真的对这个话题很感兴趣,想尽可能多地学习。我认为像我这样的人很多,因此关于此主题的任何实际问题和解决它们的最佳实践都将非常有帮助。
'\0'
在许多情况下都很有效)。当然,仍然存在客户端发送无休止的字符串以过载服务器的可能性,但是如果长度不正确,至少您不会挂起等待更多字节。 - Jonathan