2015-01-02 27 views
1

我是一个插座/网络代码新手,所以这可能是一个愚蠢的问题。多个本地进程具有相同的套接字

我使用AF_INET协议运行多个本地“客户端”和本地“服务器”。

但是,当我尝试所有的客户端到服务器,他们似乎连接在同一个套接字,从单一的荒谬的阅读。

下面的代码演示了与任何服务器代码无关的问题。

#include <iostream> 
#include <sys/socket.h> 

int main(int argc, char* argv[]) 
{ 
    int sockfd;  // socket file descriptor 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    std::cout<<"socket is "<<sockfd<<std::endl; 

    /* perform various i/o tasks */ 

    return 0; 
} 

的插座这里总是3无论多少这些进程都在运行。

这是预期吗?如果是这样,那么什么可能是最好的方式去做这种事情,因为我想使用互联网协议,以允许我的本地网络或在线相同的功能。

+2

'socket'返回一个文件描述符,默认情况下该文件描述符总是独立于进程。这是正常的,不会影响在回送接口上可以建立多少个连接。 –

+0

_“当我尝试和所有客户端到服务器”_? _“它们似乎连接在同一个套接字上,从单个无意义的”_“中读取数据。 –

回答

3

是的,它是预期的; file descriptors —至少,符合POSIX酮—由您的OS上的每个进程的基础发放了:

通常,文件描述符是为在包含一个驻留内核的数组中的条目的索引打开文件的详细信息。在POSIX中,这个数据结构称为文件描述符表,每个进程都有自己的文件描述符表。进程通过系统调用将文件描述符传递给内核,内核将代表进程访问文件。该进程本身不能直接读取或写入文件描述符表。

在Linux上,可以在路径/ proc/PID/fd /下访问在进程中打开的文件描述符集,其中PID是进程标识符。

在类Unix系统中,文件描述符可以引用任何在文件系统中命名的Unix文件类型。除了常规文件,还包括目录,块和字符设备(也称为“特殊文件”),Unix域套接字和命名管道。文件描述符还可以引用文件系统中通常不存在的其他对象,例如匿名管道和网络套接字。

你的情况

所以,更可能,以下是已经默认分配:

  • 0标准输入
  • 1标准输出
  • 2标准错误

所以第一你要求自己变成3

您无需担心这一点。进程1100上的FD 3与进程1101上的FD 3完全不同。这不会对您的代码或客户端/服务器系统造成问题。你可能可能刚刚经过测试发现。

+0

这是我经常在POSIX上忘记的东西,谢谢提醒。它看起来像我有其他无关的问题,然后导致我的问题。 – foips

1

socket返回的数字是而不是套接字号,它只是由OS和/或语言运行时维护的表中的不透明索引。每个进程都有自己的表格,因此这些数字被复制是正常的,没有什么可担心的。

您可以使用getsockname来获取有关套接字本身的扩展信息,例如端口号。

相关问题