【问题标题】:Understanding socket() output理解 socket() 输出
【发布时间】:2014-01-21 03:46:46
【问题描述】:

这可能看起来像一个愚蠢的问题,但我在家里没有比这更好的事情了。一直在做一个项目。我写了这段代码,但无法理解输出。谁能解释一下-

int MasterSocket[3];
int i = 0;
for(i=0; i<3; i++)
{
    MasterSocket[i] = socket(AF_INET , SOCK_STREAM , 0);
}

for(i=0; i<3; i++)
{
    printf("\n%d---\n", MasterSocket[i]);
}

输出-

ansh@daweed69-laptop:~/Ubuntu One/workspace/multiConnectionSockets/Debug$ ./multiConnectionSockets 

3---

4---

5---

[来自 cmets 的更新:]

为什么描述符输出必须从 3 开始? 0、1 和 2 是预定义的!?!?

【问题讨论】:

  • 实际上,我必须阅读文档 才能记住... man socket :成功时,将返回新套接字的文件描述符。出错时,返回 -1,并适当设置 errno。
  • 但是为什么描述符输出必须从 3 开始呢? 0, 1 and 2 是预定义的!?!?
  • 是的。 stdinstdoutstderr
  • 是的,0、1 和 2 是预定义的。请阅读 socket() 的文档。

标签: c linux sockets serversocket


【解决方案1】:

期望这段代码做什么?如果您阅读 socket() 函数的文档,它会说:

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);
RETURN VALUE  
       On  success,  a  file  descriptor  for  the new socket is returned.  On
       error, -1 is returned, and errno is set appropriately.

这告诉您socket() 返回int 并将其描述为“文件描述符”——操作系统使用它来引用打开的文件或类似文件的资源。所以当你运行时:

s = socket()

您将s 设置为某个整数值,当用于write()read() 系统调用等时,它指的是开放的网络连接。要了解什么是套接字以及如何使用它们,您应该阅读搜索“套接字编程示例”时会找到的众多结果之一。

【讨论】:

    【解决方案2】:

    socket() 系统调用返回一个文件描述符。在 UNIX 系统上,这将是一个整数。我不明白的是你如何两次获得“3”文件描述符。以下代码编译后不会得到重复的文件描述符:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    
    void main() {
      int MasterSocket[3];
      int i = 0;
      for(i=0; i<4; i++)
      {
        MasterSocket[i] = socket(AF_INET , SOCK_STREAM , 0);
      }
    
      for(i=0; i<4; i++)
      {
        printf("\n%d---\n", MasterSocket[i]);
      }
    }
    

    最好检查你的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 2012-08-30
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多