【问题标题】:full duplex client-server socket using threads使用线程的全双工客户端-服务器套接字
【发布时间】:2013-07-12 21:43:55
【问题描述】:

我需要在服务器和客户端之间建立双向(全双工)链接(我可以同时发送和接收数据)。通过我所做的研究,我发现最好的方法是让两个线程分别在客户端和服务器之间实现一个套接字。有没有人知道如何解决这个问题,或者看过一些类似的代码?我真的是这个领域的新手,非常欢迎任何建议......

【问题讨论】:

  • 所有套接字都是全双工的,它们可以同时发送和接收。
  • 我不知道你在哪里研究过,但不要在那里研究。
  • 是的,但是例如当服务器正在侦听套接字并且没有收到任何内容时,它不能同时发送到客户端(对于阻塞套接字的情况)。对吗?
  • 然后让socket不阻塞?还是使用select等系统调用来轮询输入?

标签: c sockets pthreads


【解决方案1】:

您不需要两个套接字来进行全双工通信,除非您使用的更高级别的传输协议会限制您同时发送和接收的能力。

这种传输限制的一个例子是,如果您的服务器真的是 HTTP 服务器。然后,如果您需要使用 HTTP 与您的应用程序进行双向通信,您可能需要一个执行 GET 的连接和另一个执行 PUT 的连接。

否则,您的客户端可以同时读取和写入同一个套接字。您可以创建 2 个线程,其中一个正在读取,另一个正在写入,但它们都将在同一个套接字上运行。

您的服务器可以使用类似的策略(每个连接一对线程),但如果服务器正在处理许多连接(例如数千个),那么您可能会遇到可伸缩性问题。通常,这是使用带有一些高性能连接多路复用器的非阻塞 I/O 来解决的,例如 epoll()kqueue(),并且您只需创建与内核一样多的线程来分配连接处理负载。查看The C10K Problem,获取有关如何实现高度可扩展的服务器的良好信息来源。

【讨论】:

  • 感谢您的澄清。你知道一个示例代码定义了两个不同的读写线程吗?正如我所说,我对套接字和线程的整个概念真的很陌生......而且在这里我没有可伸缩性问题,因为只有一个客户端和服务器在交谈,所以我不想参与非-阻塞复杂性。谢谢!
  • 另外我只需要在两者之间发送一些基本文本(不是像 HTTP 这样复杂的东西)
  • Ideone 不允许我创建线程应用程序,但你仍然可以看到我写的程序:ideone.com/K2GgZv
  • 非常感谢,这真的很有帮助......所以这是客户端的程序,我需要为服务器编写类似的东西,对吧?
  • 这是一个简单的测试程序,用于测试客户端和服务器之间的通信。尝试编译并运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2014-11-16
  • 2021-07-19
  • 2012-07-24
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多