457
Chương 11: Lập trình mạng
9.
9.
L y đ a ch IP c a client t k t n i socket
ấ ị
ỉ
ủ
ừ ế ố
L y đ a ch IP c a client t k t n i socket
ấ ị
ỉ
ủ
ừ ế ố
Ứng dụng server cần xác định địa chỉ IP của client sau khi nó chấp nhận một kết
nối.
Sử dụng phương thức
AcceptSocket
của lớp
TcpListener
để lấy lớp mức-thấp là
System.Net.Sockets.Socket
thay vì là
TcpClient
. Sử dụng thuộc tính
Socket.RemoteEndPoint
để lấy địa chỉ IP của client.
Lớp
TcpClient
không cho phép bạn thu lấy socket nằm dưới hay bất cứ thông tin nào về port
và địa chỉ IP của client. Lớp này có cung cấp thuộc tính
Socket
, nhưng thuộc tính này là
được-bảo-vệ (
protected
) và do đó không thể truy xuất được từ các lớp phi dẫn xuất. Để truy
xuất socket nằm dưới, bạn có hai tùy chọn:
•
Tạo một lớp tùy biến dẫn xuất từ
TcpClient
. Lớp này có thể truy xuất thuộc tính được-
bảo-vệ
Socket
và trưng nó ra thông qua một thuộc tính mới. Sau đó, bạn phải sử dụng
lớp tùy biến này thay cho
TcpClient
.
•
Bỏ qua lớp
TcpClient
bằng cách sử dụng phương thức
TcpListener.AcceptSocket
. Bạn
vẫn có thể sử dụng các lớp mức-cao là
BinaryReader
và
BinaryWriter
để đọc/ghi dữ
liệu, nhưng bạn cần phải tạo
NetworkStream
trước (sử dụng socket).
Mục này sử dụng cách thứ hai. Dưới đây là phiên bản sửa đổi của server trong mục 11.8:
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using SharedComponent;
public class TcpServerTest {
private static void Main() {
// Tạo listener trên port 8000.
TcpListener listener =
new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
Console.WriteLine("About to initialize port.");
listener.Start();
Console.WriteLine("Listening for a connection...");
try {