【问题标题】:HTTP socket programmingHTTP套接字编程
【发布时间】:2015-04-15 08:26:17
【问题描述】:

如果有人知道,关于套接字系统调用函数协议参数的一个非常小的具体问题,在手册中它说你把协议放在哪里,当我听到套接字协议时,我开始认为这是你把 23 放在哪里telnet,或 80 用于 http。这是正确的吗?

sockfd = socket(AF_INET, SOCK_STREAM, 0);

我只看到传递了 0 或其他非整数参数,我可以把 80 放在这里表示我想做 HTTP 吗?

套接字编程也可以通过 C++ 导入的 BSD 套接字库来完成。但是我似乎不清楚从套接字到 HTTP 编程的步骤,一旦我进行了这个编程,我将如何在这个套接字网络上建立一个 HTTP 层?

提前谢谢你(第一次上这个论坛)

http://linux.die.net/man/2/socket

what does 0 indicate in socket() system call?

Is it possible to use port 80 for both HTTP and web socket traffic?

https://www.youtube.com/watch?v=V6CohFrRNTo

【问题讨论】:

  • 您将协议与端口混淆了。虽然人们经常将 80 用于 HTTP,但您可以在任何您想要的端口上使用 HTTP 协议,并且您可以在端口 80 上使用任何协议。

标签: c++ linux sockets


【解决方案1】:

socket函数的第三个参数指定你需要的SOCK_STREAM的类型。除了默认的 TCP,还可以是 SCTP。

HTTP 的位置要高得多,因此它不需要在传输级别进行特殊处理。一个仅在 bind'ing 将创建的套接字连接到网络地址时指定端口。

【讨论】:

  • 这是不正确的。 SCTP 将是SOCK_SEQPACKET 的类型,而不是SOCK_STREAM。我的回答正确地解释了分层,而你的没有。确实,如果实现支持多个,protocol 参数将允许您指定SOCK_STREAM 的类型。如果实现在 SOCK_STREAM 之上支持内核内 HTTP,那很可能是 HTTP。
  • @DavidSchwartz:来自我们生产源代码的文字引用:socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)。 SCTP 是一种类似于 TCP 的流协议。
  • @MSalters 那么你有一个IPPROTO_SCTP 的非标准实现,由于某种原因不尊重agreed layering。如果你根据这个异常得出结论,你会得到错误的结论。
  • 你读过下一行吗? “这里,SOCK_SEQPACKET 表示创建一对多样式的套接字。”。我们的代码创建了一个常规的 1 对 1 套接字。
  • 不要在文档中途停止阅读。 agreed layering 允许两者。您引用的一半适用于多播套接字。
【解决方案2】:

socket 的第三个参数用于位于 TCP 或 UDP 之上但位于应用程序之下的协议。我不相信目前存在任何这样的协议,所以除非你正在做一些非常非常不寻常的事情,否则它总是为零。

人们可以想象一个以这种方式指定的中间协议的实现。例如,平台可以通过这种方式实现 SSL。

【讨论】:

  • 哦,这清楚了,我把端口误认为是协议,尽管 HTTP 是我认为的协议。那么我将如何使套接字端口只对 http 开放?如果没有使用这个参数?
  • HTTP 是应用层协议。这是套接字级别,就在 TCP 之上。如果您有一个可以在套接字级别执行 HTTP 的平台,您可以在此处指定它。这样的实现可能存在。它会有一些像TCPPROTO_HTTP 这样的常量供你指定。
  • @iBeyondPower 其实,第三个参数是传输层协议,可以看成是一大类协议。例如,它可以是 TCP 或 SCTP。 HTTP 高出两到三层。
  • @DavidSchwartz 第三个参数指定了人们想要的 SOCK_STREAM/SOCK_DGRAM 的确切类型。而且选择不仅是 TCP/UDP,至少还有 DCCP/STCP。
  • 一旦我设置了完整的套接字级通信,我将如何将它转换为基于 HTTP 的? o.o
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 2015-07-28
  • 2013-10-09
  • 2022-01-25
  • 2013-11-06
  • 2014-07-22
  • 2011-08-19
相关资源
最近更新 更多