两个套接字分别是TCP和UDP类型的,他们可以使用相同的端口号吗?
可以,操作系统负责把传递到内部的数据适当分配给套接字,这时就利用端口号,也就是说,通过NIC接收的数据内有端口号,操作系统正式参考此端口号把数据传输给相应端口的套接字,而套接字的类型有分为TCP面向连接的套接字和UDP面向消息的套接字,两种套接字类型,操作系统是可以按接收到的数据按套接字类型传输给相应的端口号套接字,所以TCP套接字和UDP套接字可以共用相同端口。
两个不同的TCP套接字是不可以绑定到同一个端口上的。
套接字accept()函数返回的新套接字有没有占用新的端口?
没有占用新的端口
http://blog.csdn.net/u011555996/article/details/72877549
现在使用多路IO复用epoll等,配置好点的服务器可以支持数十万个并发连接,端口号为16位,最多才2^16-1,且加上一些常用的端口号不能使用,可用的端口号都没那么多。2、现在服务器大多使用防火墙,防火墙只对特定端口开放。如果accept随机分配端口号,会不能通过防火墙。
TCP/IP协议中,IP协议是端到端的协议,它只是负责把把数据发送到端,交付给上层而已。运输层TCP、UDP加上了端口号,目的是区分不同的应用。
一个端口肯定只能绑定一个socket。
那么,当客户端发送数据过来的时候,究竟是与哪一个socket对象通信呢?
客户端发送过来的数据可以分为2种,一种是连接请求,一种是已经建立好连接后的数据传输。
由于TCP/IP协议栈是维护着一个接收和发送缓冲区的。在接收到来自客户端的数据包后,服务器端的TCP/IP协议栈应该会做如下处理:如果收到的是请求连接的数据包,则传给监听着连接请求端口的socetfd套接字,进行accept处理;如果是已经建立过连接后的客户端数据包,则将数据放入接收缓冲区。
accept返回的句柄建立的连接包括四部分:源IP、源端口号、目的IP、目的端口号。这样在一个应用程序中,就算和多个客户端建立连接,在收到数据后,应用程序通过目的IP和目的端口号也能区分是哪一条连接。