Dưới đây là mã của tôi:
$client = new-object net.sockets.udpclient(0)
write-host "You are $(((ipconfig) -match 'IPv').split(':')[1].trim()):$($client.client.localendpoint.port)"
$peerIP = read-host "Peer IP address"
$peerPort = read-host "Peer port"
$send = [text.encoding]::ascii.getbytes("heyo")
[void] $client.send($send, $send.length, $peerIP, $peerPort)
$ipep = new-object net.ipendpoint([net.ipaddress]::any, 0)
$receive = $client.receive([ref]$ipep)
echo ([text.encoding]::ascii.getstring($receive))
$client.close()
Nó như sau:
- Tạo một UDPClient với một cổng tự động gán (0).
- Lấy địa chỉ IP cục bộ và cổng được gán tự động của UDPClient và in ra cho người dùng.
- Truy xuất địa chỉ IP và cổng của người khác từ người dùng.
- Chuyển đổi chuỗi "heyo" từ mã hóa ASCII thành mảng byte và gửi nó tới đồng đẳng. (I tin nó sẽ nằm ở đầu của người ngang cho đến khi nó được "nhận", thậm chí trong vài giây.)
- Tạo IPEndPoint nhận gói UDP từ bất kỳ địa chỉ IP nào và bất kỳ cổng nào (0).
- Nhận bất kỳ dữ liệu nào được gửi từ đồng đẳng dưới dạng mảng byte mới với IPEndPoint đó làm thông số tham chiếu (hiện lưu trữ nguồn gốc của gói nhận được).
- Chuyển đổi mảng byte đã nhận thành chuỗi được mã hóa ASCII và in ra.
- Đóng UDPClient. (Hãy chắc chắn để làm điều này;! Cách khác, các nguồn lực sẽ kéo dài (cho đến khi bạn khởi động lại PS))
Vẻ đẹp của kịch bản này là nó rất đơn giản và dễ hiểu và bạn có thể sử dụng nó cả với localhost
/127.0.0.1
(trong hai cửa sổ PowerShell riêng biệt) hoặc với địa chỉ IP bên ngoài, nếu đó là địa chỉ IP cục bộ, bạn sẽ biết vì địa chỉ IP được in ra cho bạn bởi tập lệnh.
Lưu ý rằng có một SendAsync và một ReceiveAsync cho UDPClient, nhưng không có thời gian chờ cho chúng. Một số người đã nấu các giải pháp phức tạp cho việc này, nhưng bạn cũng có thể sử dụng các lệnh Start-Job
của PowerShell và các lệnh *-Job
khác và đặt một vòng nhận trong mã chạy riêng.
Hi, Kiểm tra như sau: http://www.leeholmes.com/blog/2009/10/28/scripting-network-tcp-connections-in-powershell/ Nó đề cập đến TCP, nhưng thay vào đó chúng ta có thể thay đổi được UDP . – Arcass
Cảm ơn bạn, đó là một khởi đầu tốt và nó dẫn tôi đến một số bài viết khác và tài liệu MSDN, sau đó mở ra một số câu hỏi khác ... Liệu tuyên bố này "$ RemoteIpEndPoint = [Net.EndPoint] (New-Object Net.IPEndPoint ($ ([Net.IPAddress] :: Any, 0))) "có nghĩa là máy chủ sẽ nghe trên 0.0.0.0 và trên tất cả các cổng UDP? – CRCerr0r
OK, vì vậy tôi thấy [ở đây] (http://msdn.microsoft.com/en-us/library/system.net.ipaddress.aspx) rằng 'Bất kỳ' có nghĩa là nó sẽ lắng nghe trên tất cả các địa chỉ cục bộ và [tại đây ] (http://msdn.microsoft.com/en-us/library/k17zbw22.aspx) '0' có nghĩa là nó sẽ lấy bất kỳ cổng nào có sẵn. Câu hỏi của tôi là - nếu tôi tạo một đối tượng khách hàng, hãy kết nối với máy chủ từ xa và gửi một chuỗi, như sau: $ UDPclient = new-object System.Net.Sockets.UdpClient; $ UDPclient.Kết nối ($ remoteHost, $ port); $ UDPclient.Send ($ sendBytes, $ sendBytes.Length); Hệ điều hành/.NET xử lý lưu lượng truy cập trả về tự động khi tôi thực hiện điều này (để được tiếp tục): – CRCerr0r