【问题标题】:In socket, what happen if we take SOCK_STREAM as second and UDP as third argument in socket()?在 socket 中,如果我们在 socket() 中将 SOCK_STREAM 作为第二个参数,将 UDP 作为第三个参数会发生什么?
【发布时间】:2015-01-15 10:48:41
【问题描述】:
socket(AF_INET, SOCK_STREAM, 0);

通常我们将0 作为socket() 的第三个参数,所以这里默认使用TCP 作为传输协议。但是如果我们用 UDP 代替 0 呢?

【问题讨论】:

  • 何不自己试试呢?
  • @SouravGhosh 因为他无法可靠地测试发生了什么。它可能只是 UB。
  • @usr 检查系统调用的成功[失败],errno 是基础。
  • @usr 要么成功,要么失败。如果失败,该函数返回 -1 并且有一个 errno 值要询问。未定义行为的概念来自语言规范,而不是系统库。
  • @EJP 并非所有库调用都完全验证其参数。如果库作者没有指定传递无效参数时会发生什么,则可能有 UB。也就是说,我认为这里不是这种情况。此外,调用可能仅在某些情况下成功。这是不可测试的。我认为这个问题是有效的。

标签: c sockets tcp udp


【解决方案1】:

调用可能会失败(socket() 返回 -1),您可以检查 errno 以了解原因。 在 linux 上,会发生这种情况:

$ cat t.c
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc,char argv[])
{
  int rc = socket(AF_INET, SOCK_STREAM, IPPROTO_UDP);
  printf("rc = %d errno = %d : %s\n", rc, errno, strerror(errno));
  return 0;
}
$ gcc t.c
$ ./a.out
rc = -1 errno = 93 : Protocol not supported

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2019-10-18
    相关资源
    最近更新 更多