最大連線數「65535」的誤解

2022-05-22 15:33:13 字數 1995 閱讀 3170

讓我們先看一下socket的程式設計模型:

以上來自此文

和c語言不同的是,go語言在底層幫我們封裝了socket,listentcp的時候建立,繫結,並監聽;dialtcp的時候,建立並連線 。具體可以看此文,或者用除錯模式跟蹤一下。下面讓我們用**來看清伺服器只能有65536個最大鏈結的謬論吧。

server.go

package main

import (

"fmt"

"net"

"os"

)func main()

//建立tcp協議

tcpaddr, err := net.resolvetcpaddr("tcp4", os.args[1]) //tcp4 是協議版本,還有tcp6 如果只有埠的話預設繫結127.0.0.1

checkerror(err)

//建立、繫結、監聽socket

listener, err := net.listentcp("tcp4", tcpaddr)

checkerror(err)

for

//處理連線

go handleclient(conn) }}

func handleclient(conn net.conn)

func checkerror(err error)

}

package main

import (

"fmt"

"net"

"os"

"time"

)func main()

tcpaddr, err := net.resolvetcpaddr("tcp4", os.args[1])

checkerror(err)

//建立socket並連線伺服器

conn, err := net.dialtcp("tcp4", nil, tcpaddr)

checkerror(err)

fmt.printf("client address %s\n",conn.localaddr().string())

defer conn.close()

var buf [512]byte

for

checkerror(err)

fmt.printf("receive %s from server\n",string(buf[0:n])) }}

func checkerror(err error)

}

需要兩台電腦測試,這裡使用虛擬機器

啟動服務端

go run server.go 0.0.0.0:7777 ,這裡在虛擬機器上執行服務端

這裡0.0.0.0 的意思是允許來自外部的鏈結

啟動客戶端

檢視埠服務端

客戶端

從上圖我們可以看到:

看一下socket的程式設計模型,我估計在與服務端的accept這個環節。其實這個環節並沒有另外去繫結乙個埠來和客戶端通訊。

擴充套件一下,其實對於服務端來說,埠數並不能限制(因為只繫結乙個埠),那麼連線客戶端的總數限制就在於記憶體、cpu和網路頻寬了。

對於客戶端呢,連線同乙個服務端時,都要占用乙個埠,對同一臺電腦,限制可以執行的客戶端總數就在於埠數、記憶體、cpu和網路頻寬。

另外65535這個數目實際上是可以更改的。

這裡的虛擬機器使用的vagrant,乙個方便的虛擬機器管理軟體,

最大連線數 Linux的檔案最大連線數

too many open files 檢視當前作業系統連線數設定 ulimit a修改伺服器最大連線數 vim etc security limits.conf新增 soft nofile 65535 hard nofile 65535 soft nproc 65535 hard nproc 65...

MYSQL 檢視最大連線數和修改最大連線數

mysql檢視最大連線數和修改最大連線數 1 檢視最大連線數 show variables like max connections 2 修改最大連線數 set global max connections 200 以下的文章主要是向大家介紹的是mysql最大連線數的修改,我們大家都知道mysql最...

MYSQL 檢視最大連線數和修改最大連線數

mysql檢視最大連線數和修改最大連線數 1 檢視最大連線數 show variables like max connections 2 修改最大連線數 set global max connections 200 以下的文章主要是向大家介紹的是mysql最大連線數的修改,我們大家都知道mysql最...