收听多个端口并接受连接

时间:2018-05-18 18:34:25

标签: c server httprequest

这是我的代码示例。我创建了两个套接字,打开了两个端口并试图接受连接。我的所有文件描述符都设置为public int getPairs(final String hand) { int count = 0; List<String> cards = getParts(hand, 2); for (int i = 0; i < cards.size() - 1; i++) { for (int j = i + 1; j < cards.size(); j++) { if (cards.get(i).charAt(1) == cards.get(j).charAt(1)) { count++; } } } return count; } private static List<String> getParts(final String string, final int partitionSize) { List<String> parts = new ArrayList<>(); int len = string.length(); for (int i = 0; i < len; i += partitionSize) { parts.add(string.substring(i, Math.min(len, i + partitionSize))); } return parts; }

文件描述符NONBLOCK用于接受端口8080中的HTTP GET请求。

文件描述符fd_client_serv用于从端口9090中的客户端接受我服务器上的命令。

当我发送HTTP请求时,我想读取请求并只打印第一行。但有时它是有效的,有时它不会。在服务器运行时,我使用curl发送请求。有时服务器会继续打印消息,有时则不然。我猜双重fd_client_comm存在问题。

你可以给我一些帮助吗?

accepting

1 个答案:

答案 0 :(得分:1)

除非侦听套接字设置为非阻塞,否则accept()函数会阻止,直到接受连接。即使你的侦听套接字是非阻塞的,你也会遇到一个性能紊乱的繁忙循环。因此,虽然每次循环迭代有两个accept()次调用不是本身错误,但您不太可能使它们能够很好地协同工作。

相反,请考虑其中一种选择:

  • 分叉一个单独的子进程来处理应用程序服务的每个端口,或者
  • 使用单独的线程或
  • 为每个端口提供服务
  • 使用select()poll()或类似的方式对多个端口和/或多个并发客户端进行多路复用I / O处理。