×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

回答 #148555, 关于地址端口复用。

如果一个机器A有client-c1和server-s1,并共用一个IP地址-ipa和端口号-pna。它们要和另外一个机器B通讯,并且c1 connect到B 地址-ipb和端口-pnb,s1 accept 远端地址和端口也为ipb, pnb, 那么不可以。
除此以外均可。

在bind前需做以下工作才不会报错:
sockopt=1
if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&sockopt, sizeof (sockopt)) != 0)
{
perror("setsockopt");;
exit(1);
} .
if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEPORT, (char *)&sockopt, sizeof (sockopt)) != 0)
{
perror("setsockopt");;
exit(1);
} .

如果你用的是Linux, 那么第2个SO_REUSEPORT不可用,即不能端口复用。Freebsd两个都可以,破破的Windows我不知道,你可以去试。
Report

Replies, comments and Discussions:

  • 工作学习 / IT技术讨论 / 回答 #148555, 关于地址端口复用。
    如果一个机器A有client-c1和server-s1,并共用一个IP地址-ipa和端口号-pna。它们要和另外一个机器B通讯,并且c1 connect到B 地址-ipb和端口-pnb,s1 accept 远端地址和端口也为ipb, pnb, 那么不可以。
    除此以外均可。

    在bind前需做以下工作才不会报错:
    sockopt=1
    if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&sockopt, sizeof (sockopt)) != 0)
    {
    perror("setsockopt");;
    exit(1);
    } .
    if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEPORT, (char *)&sockopt, sizeof (sockopt)) != 0)
    {
    perror("setsockopt");;
    exit(1);
    } .

    如果你用的是Linux, 那么第2个SO_REUSEPORT不可用,即不能端口复用。Freebsd两个都可以,破破的Windows我不知道,你可以去试。
    • 一知半解,在这卖弄什莫?(为什莫不可以?)
      除非是两个server要公用一个端口才许要那样做
      • 我不知道你为什么要说两个server, 在bind前无所谓client和server之分,也许我的例子举的不够清楚,但你可以试试,是否一个client和一个server共用一个端口, 不setsockopt就可以用.
        • 另外昨天说的"SO_REUSEPORT在Linux不可用"并不等于不能端口复用, 用SO_REUSEADDR即可, 两个setsockopt 可根据自己的情况来选取使用.