? ? 在編寫.net的網絡服務器時,我使用了裸socket來實現。在windows上,或者在linux上通過.net core來跑時都沒有什么問題,但是通過mono運行調用socket.Bind()時卻總是報ErrorCode為10022的SocketException,表示參數無效。通過命令netstat -a | grep myport并未發現端口占用現象,擔心與權限有關,sudo mono myserver.exe來運行也依然如故。后來用TcpListener來實現,這個問題就沒有了。無奈之下,去瀏覽TcpListener的源碼,發現其內部創建socket是這樣的:
m_ServerSocketEP = new IPEndPoint(localaddr, port); m_ServerSocket = new Socket(m_ServerSocketEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
? ? 再對比我的代碼,發現創建socket時使用的是未指定AddressFamily參數的構造函數。于是指定參數為AddressFamily.Network,這個問題就解決了。應該是不同的平臺實現在設置默認AddressFamily參數上有差別導致的。