.net for TCP服務端 && 客戶端

關鍵代碼

詳細代碼請看示例代碼html

Service

//建立套接字
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port);
//也能夠使用IPAddress.Any,監聽全部網絡接口上的客戶端活動
//https://docs.microsoft.com/en-us/dotnet/api/system.net.ipaddress.any?view=netframework-4.7.2
//通常來講,服務端套接字都是直接bind端口,不會顯式指明ip地址
//不然切換了服務器還須要修改,或者也能夠動態獲取IP,可是不必
IPEndPoint ipe2 = new IPEndPoint(IPAddress.Any, port);

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
//https://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values
//http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html
SetTcpKeepAlive(socket, 600000, 1000);
//綁定端口和IP
socket.Bind(ipe);
//設置監聽數
socket.Listen(10);
//鏈接客戶端
await AsyncAccept(socket);

Client

//端口及IP
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port);
//建立套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//開始鏈接到服務器
client.BeginConnect(ipe,async asyncResult =>
{
    client.EndConnect(asyncResult);
    //向服務器發送消息
    await AsynSend(client, "你好我是客戶端");
    await AsynSend(client, "第一條消息");
    await AsynSend(client, "第二條消息");
    //接受消息
    await AsynRecive(client);
}, null);

報錯

1.在其上下文中,該請求的地址無效
遇到這個問題是在正式服務器上,在測試服務器上運行良好,因此考慮是機器或者網絡配置的問題,包括出入站規則、防火牆、端口映射、端口轉向等
不是太懂運維的內容,因此對代碼進行了修改
把具體的IP改成了IPAddress.Any的寫法則運行正常git

//報錯
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port);
//正確
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, port);

參考資料

在其上下文中,該請求的地址無效github

示例代碼

示例代碼c#

相關文章
相關標籤/搜索