Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言网络编程中与套接字有关的问题_C_Sockets_Network Programming - Fatal编程技术网

C语言网络编程中与套接字有关的问题

C语言网络编程中与套接字有关的问题,c,sockets,network-programming,C,Sockets,Network Programming,有一个称为socket()的系统调用它在侦听服务器上创建套接字。 我想了解的是,服务器创建IP+端口组合。 假设telnet使用端口23。 现在,当客户端机器进行连接时,服务器正在侦听的端口上没有连接,而端口23上没有连接,事实上它位于另一个端口上 在服务器端,同样的事情也会发生。 例如,我编写了一个服务器来侦听端口23,然后在服务器端与不同的客户端进行连接。由于所有客户端都位于同一端口,因此如何区分这些连接。那么,如何在同一服务器端口上建立这么多连接呢 telnet(23)或ftp(21)或s

有一个称为
socket()的系统调用它在侦听服务器上创建套接字。
我想了解的是,服务器创建IP+端口组合。
假设telnet使用端口23。
现在,当客户端机器进行连接时,服务器正在侦听的端口上没有连接,而端口23上没有连接,事实上它位于另一个端口上
在服务器端,同样的事情也会发生。
例如,我编写了一个服务器来侦听端口23,然后在服务器端与不同的客户端进行连接。由于所有客户端都位于同一端口,因此如何区分这些连接。那么,如何在同一服务器端口上建立这么多连接呢
telnet(23)或ftp(21)或ssh(22)那么许多人仍然可以登录到服务器上的同一服务端口,即不同用户的ssh连接不止一个,而ssh只在端口22侦听。那么套接字到底做什么,或者如何创建套接字呢

更新

我得到了解释。根据来自客户端机器的IP+端口组合,服务器端的其他事情都可以处理,我认为这些信息可能被套接字文件描述符使用。我看到的是
connect()
系统调用,我们使用它如下

connect(sockfd,(struct sockaddr *)&client_address,size_t);
我们确实在客户端传递了
struct sockaddr*
,它具有唯一的IP+端口组合,我认为当服务器接收到这个时,事情就开始了。 我想进一步了解的是服务器端的参数

accept(server_sockfd,(struct sockaddr *)&client_address,(size_t *)sizeof (struct sockaddr ));
它是否获得了使用connect()从客户端传递的相同的client_地址
系统呼叫?如果是,那么同一台服务器侦听多个客户端的套接字描述符是不同的。我想知道的是,当服务器端接受客户端的请求时,如何维护服务器端的数据结构。

我将给您Qt中的伪代码来解释这一问题。所有TCP服务器都以相同的方式工作

首先创建一个侦听TCP服务器套接字。当传入的连接请求到达时,操作系统将创建一个新套接字(您的操作系统使用的端口与侦听套接字不同),并将此新套接字与远程客户端关联。TCP服务器套接字继续接受新连接,您可以通过新创建的套接字恢复与远程对等方的通信

tcpServer.listen(LocalHost, PORT);

connect(&tcpServer, SIGNAL(newConnection()),this, SLOT(NewConnection()));

//Callback that is called when server accepts a new connection
void NewConnection()
{

   //Here you will have a new socket for communication with the client
   //The tcpServer will continue listening to given port 

   QTcpSocket* connection = tcpServer.NextPendingConnection();

   //Use your new connection to communicate with the remote client...

}

我希望这能有所帮助,我会给你Qt的伪代码来解释这件事。所有TCP服务器都以相同的方式工作

首先创建一个侦听TCP服务器套接字。当传入的连接请求到达时,操作系统将创建一个新套接字(您的操作系统使用的端口与侦听套接字不同),并将此新套接字与远程客户端关联。TCP服务器套接字继续接受新连接,您可以通过新创建的套接字恢复与远程对等方的通信

tcpServer.listen(LocalHost, PORT);

connect(&tcpServer, SIGNAL(newConnection()),this, SLOT(NewConnection()));

//Callback that is called when server accepts a new connection
void NewConnection()
{

   //Here you will have a new socket for communication with the client
   //The tcpServer will continue listening to given port 

   QTcpSocket* connection = tcpServer.NextPendingConnection();

   //Use your new connection to communicate with the remote client...

}

我希望这有助于通过4个参数识别TCP连接:

  • 本地IP
  • 本地港口
  • 远程IP
  • 远程端口

因此,即使两个连接共享相同的本地IP和端口,操作系统也可以区分它们,因为远程IP和/或端口将不同。

TCP连接由4个参数标识:

  • 本地IP
  • 本地港口
  • 远程IP
  • 远程端口

因此,即使两个连接共享相同的本地IP和端口,操作系统也可以区分它们,因为远程IP和/或端口将不同。

标识连接的唯一组合是:

  • 源地址和端口
  • 目的地址和端口
在您的示例中,许多连接的目标地址和端口是相同的,但每个都来自源地址和端口的唯一组合

下面是我通过FTP(端口21)从桌面连接到服务器的简短
tcpdump
会话:

22:55:50.160704 IP 172.17.42.19.64619>172.17.42.1.21:S 2284409007:2284409007(0)win 8192
22:55:50.160735 IP 172.17.42.1.21>172.17.42.19.64619:S 1222495721:1222495721(0)ack 2284409008 win 65535
22:55:50.160827 IP 172.17.42.19.64619>172.17.42.1.21:。阿克1胜8192
22:55:50.162991 IP 172.17.42.1.21>172.17.42.19.64619:P1:61(60)ack 1赢65535
22:55:50.369860 IP 172.17.42.19.64619>172.17.42.1.21:。ack 61胜8132
22:55:56.288779 IP 172.17.42.19.64620>172.17.42.1.21:S 3841819536:3841819536(0)赢8192
22:55:56.288811 IP 172.17.42.1.21>172.17.42.19.64620:S 454286057:454286057(0)ack 3841819537赢65535
22:55:56.288923 IP 172.17.42.19.64620>172.17.42.1.21:。阿克1胜8192
22:55:56.290224 IP 172.17.42.1.21>172.17.42.19.64620:P1:61(60)ack 1赢65535
22:55:56.488239 IP 172.17.42.19.64620>172.17.42.1.21:。ack 61胜8132
22:56:03.301421 IP 172.17.42.19.64619>172.17.42.1.21:P1:12(11)ack 61 win 8132
22:56:03.306994 IP 172.17.42.1.21>172.17.42.19.64619:P 61:94(33)ack 12 win 65535
22:56:03.510663 IP 172.17.42.19.64619>172.17.42.1.21:。ack 94胜8099
22:56:06.525348 IP 172.17.42.19.64620>172.17.42.1.21:P1:12(11)ack 61 win 8132
22:56:06.526332 IP 172.17.42.1.21>172.17.42.19.64620:P 61:94(33)ack 12 win 65535
22:56:06.726857 IP 172.17.42.19.64620>172.17.42.1.21:。ack 94胜8099
您可以看到初始连接是
172.17.42.19.64619 172.17.42.1.21
。端口64619是Windows 7框在进行传出连接时选择的源端口。带有
S
的两行是来回建立连接的
SYN
数据包。然后我启动下一个连接,Windows只使用下一个可用端口64620。连接
172.17.42.19.64620 172.17.42.1.21
形成我在顶部列出的项目的一个新的唯一元组。O