我刚刚开始学习网络概念。
在这个多线程服务器/客户端program中,最后会为服务器编写代码来处理多个连接。我的问题是服务器如何处理同一插槽上的多个连接。端口(8888)。一个套接字一次只能接受一个端口上的一个客户端,通过创建pthread_create()
,线程在这个角色扮演什么角色?
有人可以给我一个套接字,端口,线程的图形表示,这样我就会清楚。我读的越多,我就越感到困惑。
答案 0 :(得分:3)
当服务器收到连接请求时,它可以通过接受请求来完成连接。
已建立为服务器的套接字可以接受来自多个客户端的连接请求。服务器的原始套接字不会成为连接的一部分;相反,accept创建一个参与连接的新套接字。 accept返回此套接字的描述符。服务器的原始套接字仍可用于侦听进一步的连接请求。
在您的情况下使用accept
连接新客户端时,为特定客户端创建新文件描述符。 pthread_create
使用此客户端文件描述符创建新线程并完成其工作。
EDIT1:
tcp服务器中的每个连接由4元组(serverip,serverport,destip,destport)区分。服务器在同一端口和IP上侦听,当客户端从不同的IP或不同的端口连接时,它将是一个不同的连接。
在你的情况下:
EDIT2:
从链接客户端程序中可用的代码告诉,连接到服务器的8888端口。客户端还需要一个端口来连接服务器,您不是自己在程序中分配客户端的端口。客户端程序动态选择随机端口。此随机端口将与8888不同。通过使用此随机端口客户端连接到服务器的8888端口。
所以服务器和客户端端口会有所不同,这将是一个不同的连接。使用wireshark捕获数据包,然后进行分析以获得更多说明。
答案 1 :(得分:1)
就像你坚持服务器端而不清楚服务器端accept()
的功能是什么
所以 accept()函数将提取挂起连接队列上的第一个连接,创建一个具有相同套接字类型协议的新套接字和地址系列作为指定套接字,并为该套接字分配新的文件描述符。
accept()
函数采用以下参数:
<强>插座强>:
指定使用socket()
创建的套接字,已使用bind()绑定到地址,并已成功调用listen()。
<强>地址强>: 空指针或指向sockaddr结构的指针,其中应返回连接套接字的地址。
<强> address_len 强>: 指向socklen_t结构,该结构在输入时指定所提供的sockaddr结构的长度,并在输出上指定存储地址的长度。
因此,虽然服务器IP和服务器端口在所有接受的连接中都是常量,但客户端信息可以让它跟踪所有事情的进展。
例如
假设我们的服务器位于192.168.1.1:80,还有两个客户端,171.0.0.1和171.0.0.2。
171.0.0.1在本地端口1234上打开连接并连接到服务器。现在服务器有一个标识如下的套接字:
171.0.0.1:1234 - 192.168.1.1:80
现在171.0.0.2在本地端口5678上打开连接并连接到服务器。现在服务器有两个插座,标识如下:
171.0.0.1:1234 - 192.168.1.1:80
171.0.0.2:5678 - 192.168.1.1:80
在服务器端为不同的客户端连接返回不同的描述符。
答案 2 :(得分:0)
这就是典型的服务器行为,
我们将套接字绑定到接口,这可以是特定接口或所有接口INADDR_ANY。
Accept是阻塞调用,它接受客户端请求,返回新的sockfd以便您处理请求。
你可以在有界套接字上看到netstat结果,你可以在服务器监听套接字上看到LISTEN,RECV,SEND计数。
你是对的,所有客户端套接字都连接在服务器绑定的接口上
您的客户端套接字文件描述符总数有限制。
要增加客户端数量,可以设置“ulimit”。
因此除了服务器绑定套接字之外,还会为每个客户端消息处理创建N个套接字。
浏览netstat输出
netstat -antp - &gt;用于tcp规定输出。