Đáp án: + Gởi trực tiếp ra ngoài + Khi các host gởi dữ liệu theo giao thức UDP thì nó sẽ gởi dữ liệu đến bộ đệm UDP của host cần gởi đến và toàn bộ dữ liệu trong 1 lần gởi của host gởi p
Trang 1ĐÁP ÁN VẤN ĐÁP MÔN LẬP TRÌNH MẠNG LẦN 1 LỚP: CTK29, CTK28, CTK27 HỌC KỲ: II NĂM HỌC: 2008-2009
1) Khi gởi các gói tin ra ngoài mạng theo giao thức UDP thì nó sẽ gởi trực tiếp ra ngoài hay nó gởi ra
bộ đệm trước?Giải thích cách gởi dữ liệu theo giao thức UDP?
Đáp án: + Gởi trực tiếp ra ngoài + Khi các host gởi dữ liệu theo giao thức UDP thì nó sẽ gởi dữ liệu đến bộ đệm UDP của host cần gởi đến và toàn bộ dữ liệu trong 1 lần gởi của host gởi phải được đọc hết bằng 1 lần đọc của host nhận Nếu host nhận không thể đọc được hết dữ liệu trong 1 lần gởi lên của host gởi thì sẽ phát sinh ra lỗi
2) Khi đang chạy chương trình UDP Server và UDP Client, ta bất ngờ tắt chương trình UDP Client thì
ở server có báo lỗi không?Vì sao?
Đáp án: + Không báo lỗi + Vì UDP là giao thức phi kết nối
3) Khi gởi các gói tin ra ngoài mạng theo giao thức TCP thì nó sẽ gởi trực tiếp ra ngoài hay nó gởi ra
bộ đệm trước?Giải thích các gởi dữ liệu theo giao thức TCP?
Đáp án: + Nó sẽ gởi trực tiếp ra ngoài + Khi các host gởi dữ liệu theo giao thức TCP thì nó sẽ gởi
dữ liệu đến bộ đệm TCP của host cần gởi đến Các dữ liệu nhận được sau sẽ được đặt liền ngay sau phần dữ liệu đã nhận được trước và mỗi lần host nhận đọc dữ liệu bằng phương thức Receive() thì lượng dữ liệu đọc được sẽ phụ thuộc vào bộ đệm truyền vào phương thức
Receive()
4) Giao thức UDP có cần phải phân biệt biên của các thông điệp hay không?Hãy cho biết cách gởi
dữ liệu theo giao thức UDP?
Đáp án: + Giao thức UDP không cần phân biệt biên của các thông điệp
Trang 2+ Khi các host gởi dữ liệu theo giao thức UDP thì nó sẽ gởi dữ liệu đến bộ đệm UDP của host cần gởi đến
và toàn bộ dữ liệu trong 1 lần gởi của host gởi phải được đọc hết bằng 1 lần đọc của host nhận Nếu host nhận không thể đọc được hết dữ liệu trong 1 lần gởi lên của host gởi thì sẽ phát sinh ra lỗi
5) Giao thức TCP có cần phải phân biệt biên của các thông điệp hay không?Hãy cho biết cách gởi dữ liệu theo giao thức TCP
Đáp án: + Giao thức TCP cần phân biệt biên của các thông điệp + Khi các host gởi dữ liệu theo giao thức TCP thì nó sẽ gởi dữ liệu đến bộ đệm TCP của host cần gởi đến Các dữ liệu nhận được sau sẽ được đặt liền ngay sau phần dữ liệu đã nhận được trước và mỗi lần máy nhận đọc dữ liệu bằng phương thức Receive() thì lượng dữ liệu đọc được sẽ phụ thuộc vào bộ đệm truyền vào phương thức Receive()
6) Khi dùng phương thức ReceiveFrom() của giao thức UDP để đọc dữ liệu, nếu bộ đệm dữ liệu truyền vào phương thức nhỏ và dữ liệu không được đọc hết bằng phương thức ReceiveFrom() thì phần dữ liệu còn lại sẽ ở đâu?
Đáp án: + Phần dữ liệu này sẽ bị hủy bỏ
7) Khi dùng phương thức Receive() của giao thức TCP để đọc dữ liệu, nếu bộ đệm dữ liệu truyền vào phương thức nhỏ và dữ liệu không được đọc hết bằng phương thức Receive() thì phần dữ liệu còn lại sẽ ở đâu?
Đáp án: + Phần dữ liệu còn lại sẽ nằm trong bộ đệm TCP 8) Phương thức Receive() khác với phương thức ReceiveFrom() chỗ nào? Đáp án: Phương thức ReceiveFrom() có thêm 1 đối số nữa
là ref EndPoint, đối số này sẽ chứa thông tin (IP, port) của host gởi dữ liệu tới
9) Phương thức Send() khác với phương thức SendTo() chỗ nào? Đáp án: Phương thức SendTo()
có thêm 1 đối số nữa là EndPoint, đối số này sẽ chứa thông tin (IP, port) của host cần gởi dữ liệu tới
Trang 310) Tại sao trước khi gọi phương thức Receive() ta phải reset lại buffer?
Đáp án: Khi gọi phương thức Receive() để đọc dữ liệu, thì dữ liệu của những lần gọi phương thức Receive() trước vẫn còn trong buffer và khi gọi phương thức Receive() nếu lượng dữ liệu đọc được là ít thì phần dữ liệu mới đọc được sẽ đè lên phần dữ liệu của các lần gọi phương thức Receive() trước nhưng sẽ không đè hết buffer nên sẽ có phần dữ liệu thừa phía sau buffer Vì vậy trước khi gọi phương thức Receive() ta phải reset lại buffer
11) Trong khi lập trình mạng ở Server ta phải dùng tối thiểu mấy socket?, các socket đó dùng như thế nào?
Đáp án: + Phải dùng tối thiểu 2 socket: 1 socket lắng nghe kết nối và 1 socket trả về khi client kết nối tới + Socket lắng nghe kết nối sẽ kết nối với 1 endpoint cục bộ và lắng nghe kết nối đến, sau khi có client kết nối đến, phương thức Accept của socket này sẽ trả về socket mới và socket này chịu trách nhiệm truyền
dữ liệu qua lại giữa client và server
12) Giải thích ý nghĩa các đối số trong phương thức tạo lập của TcpSocket:
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Đáp án
+ AddressFamily.InterNetwork: sử dùng địa chỉ IP V4 + SocketType.Stream: Kiểu socket là Stream, kiểu socket này dùng với giao thức TCP + ProtocolType.Tcp: giao thức sử dụng TCP
13) Giải thích ý nghĩa các đối số trong phương thức tạo lập của UdpSocket:
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Đáp án: + AddressFamily.InterNetwork: sử dùng địa chỉ IP V4 + SocketType.Dgram: Kiểu socket là Dgram, kiểu socket này dùng với giao thức UDP + ProtocolType.Udp: giao thức sử dụng UDP 14) Khi client kết nối tới server tại port 8000 thì client sẽ dùng port nào kết nối đến? Đáp án: Client có thể dùng bất kỳ port nào > 1024 còn trống trên máy client để kết nối đến
Trang 415) Phương thức Bind() của lớp Socket dùng để làm gì? Kiểu đối số truyền vào của hàm Bind() Đáp án: + Phương thức Bind() của lớp Socket dùng để kết hợp socket với 1 endpoint + Kiểu đối số truyền vào là 1 endpoint 16) Giải thích cách hoạt động của phương thức Accept() của lớp Socket? Đáp án: Phương thức Accept() sẽ lấy yêu cầu kết nối đầu tiên từ hàng đợi kết nối của socket đang lắng nghe và trả về 1 socket mới Nếu trong hàng đợi kết nối không có yêu cầu kết nối nào thì phương thức Accept() sẽ bị block cho đến khi có yêu cầu kết nối mới Mỗi khi kết nối được chấp nhận, socket ban đầu tiếp tục xếp hàng các yêu cầu kết nối tiếp theo cho tới khi đóng socket lại 17) Phương thức Receive() của lớp Socket sẽ trả về 0 khi nào? Đáp án: Khi Client gởi tín hiệu kết thúc phiên làm việc (bằng cách gởi cờ FIN trong gói TCP hoặc gọi phương thức ShutDown()), nếu trong bộ đệm TCP không còn dữ liệu thì phương thức Receive() sẽ trả
về giá trị 0 18) Khi lập trình mạng ta sẽ lắng nghe client kết nối đến trên một port, khi một client khác kết nối vào server ta có thể dùng port này để cho phép client kết nối vào không hay cần phải dùng port khác? Đáp án: Vẫn dùng Port này 19) Phương thức Connect() của lớp Socket thực hiện việc kết nối đồng
bộ hay bất đồng bộ? Đáp án: Đồng bộ 20) Giải thích quá trình thành lập kết nối của giao thức TCP? Đáp án: • Thiết bị gởi gởi cờ SYN cho biết bắt đầu phiên làm việc • Thiết bị nhận gởi cả cờ SYN và cờ ACK trong cùng một gói tin cho biết nó chấp nhận bắt đầu phiên làm việc
Trang 5• Thiết bị gởi gởi cờ ACK cho biết phiên làm việc đã mở và đã sẵng sàng cho việc gởi và nhận các gói tin 21) Giải thích quá trình đóng kết nối của giao thức TCP? Đáp án: • Thiết bị khởi đầu đóng kết nối gởi cờ FIN • Thiết bị bên kia gởi cờ FIN và ACK trong cùng một gói tin cho biết nó chấp nhận đóng kết nối • Thiết bị khởi đầu đóng kết nối gởi cờ ACK để đóng kết nối 22) Sau khi quá trình thành lập kết nối TCP được thành lập, lúc trao đổi dữ liệu giữa client và server thì trong các gói tin gởi đi và nhận về thì cờ nào được set? Đáp án: Cờ ACK 23) Client gởi 1024 byte dữ liệu lên TCP server, trên TCP server ta dùng phương thức Receive() để đọc nhưng buffer chỉ có chiều dài tối đa là 100 byte Hỏi phương thức
Receive() có phát sinh ra lỗi hay không? Số byte còn lại sẽ được xử lý ra sao? Đáp án: + Không phát sinh lỗi + Số byte còn lại vẫn nằm trong bộ đệm TCP 24) Client gởi 1024 byte dữ liệu lên UDP server, trên UDP server ta dùng phương thức ReceiveFrom() để đọc nhưng buffer chỉ có chiều dài tối đa là 100 byte Hỏi phương thức ReceiveFrom() có phát sinh ra lỗi hay không? Số byte còn lại được xử lý ra sao? Đáp án: +
Có phát sinh lỗi + Số byte còn lại sẽ bị hủy bỏ 25) Client gởi 1024 byte dữ liệu lên TCP server, trên TCP server ta dùng phương thức Receive() để đọc nhưng buffer chỉ có chiều dài tối đa là 100 byte Trong trường hợp này server sẽ xử lý ra sao? Đáp án: Server sẽ đọc 100 byte đầu tiên trong bộ đệm TCP và sau khi đọc xong 100 byte này nó sẽ xóa 100 byte đầu tiên trong bộ đệm TCP và 924 byte (924=1024-100) còn lại sẽ nằm trong bộ đệm TCP và chờ lần gọi phương thức Receive() tiếp theo
Trang 626) Client gởi 1024 byte dữ liệu lên UDP server, trên UDP server ta dùng phương thức ReceiveFrom() để đọc nhưng buffer chỉ có chiều dài tối đa là 100 byte Trong trường hợp này server sẽ xử lý ra sao? Đáp án: Do buffer không đủ lớn để đọc dữ liệu từ client gởi lên nó sẽ phát sinh ra biệt lệ 27) Các đối số của các phương thức bất đồng bộ như BeginConnect(), BeginAccept(), BeginSend(),… khác với các đối số của phương thức Begin(), Accept(), Send(),… như thế nào? Đáp án: Ngoài các đối số bình thường của Begin(), Accept(), Send(),… thì trong các phương thức BeginConnect(), BeginAccept(), BeginSend(),… có thêm 2 đối số: -AsyncCallback: đây là delegate tham chiếu đến hàm callback, hàm callback này sẽ đảm nhận việc thực thi bất đồng bộ trong 1 thread mới -object: chứa đựng thông tin về đối tượng thực thi bất đồng bộ 28) IPEndPoint là gì? Đáp án: IPEndPoint là một network endpoint (IP và Port), các thông tin IP và Port cần thiết để ứng dụng kết nối đến dịch vụ ở 1 host 29) Delegate là gì? Hãy kể một số trường hợp sử dụng Delegate Đáp án: + Delegate là một đối tượng mô tả một phương thức và đối tượng này được kết hợp với một phương thức Khi delegate được gọi thì phương thức tương ứng được gọi + Phương thức do delegate tham chiếu đến phải cùng chữ ký với delegate (kiểu trả về, các đối số phải giống nhau) + Delegate được dùng vào lúc thiết kế, lúc này chưa biết phương thức nào sẽ được gọi Một số trường hợp
sử dụng delegate: + Tạo phương thức thực thi bất đồng bộ + Sử dụng delegate để tham chiếu đến phương thức mà hiện tại chưa biết phương thức đó là phương thức gì +…
Trang 730) Hàm Callback xử lý bất đồng bộ, có 1 đối số là IAsynResult đối số này dùng để làm gì? Đáp án: + Trong hàm callback thì đối số duy nhất của hàm này là IAsynResult sẽ chứa thông tin bất đồng bộ từ hàm Begin truyền đến 31) Trong quá trình lập trình bất đồng bộ thông tin được truyền từ phương thức bắt đầu xử lý bất đồng bộ (các phương thức Begin) đến hàm callback xử lý khi phương thức bất đồng bộ kết thúc được truyền như thế nào? Đáp án: + Khi gọi hàm Begin() ngoài các đối số của phương thức mà delegate đang được gọi tham chiếu đến thì còn 2 đối số khác: -AsyncCallback: đây là delegate tham chiếu đến hàm callback, hàm callback này sẽ đảm nhận việc thực thi bất đồng bộ trong 1 thread mới -object: chứa đựng thông tin về đối tượng thực thi bất đồng bộ + Thông tin được truyền cho hàm callback được thực hiện thông qua đối số cuối cùng object + Trong hàm callback thì đối số duy nhất của hàm này là IAsynResult sẽ chứa thông tin bất đồng bộ từ hàm Begin truyền đến và được lấy lại thông qua thuộc tính AsyncState của IAsynResult (phải ép kiểu) 32) Các đối số của hàm kết thúc việc xử lý bất đồng
bộ (các hàm End) Đáp án: Các hàm End chỉ có 1 đối số duy nhất là IAsynResult 33) Các bước tạo ra ứng dụng một server nhiều client Đáp án: + Trên server ta sẽ dùng vòng lặp vô hạn để kiểm tra các client kết nối vào + Mỗi khi client kết nối vào thì tạo ra 1 thread riêng để xử lý việc kết nối với client + Việc gởi và nhận dữ liệu với client được thực hiện thông qua thread này 34) Cho đoạn chương trình sau:
byte[] buff = new byte[10]; string hello = "Xin chao client"; buff = Encoding.ASCII.GetBytes(hello);
Console.WriteLine(Encoding.ASCII.GetString(buff,0,buff.Length));
Kết quả xuất ra là gì? Đáp án: Xin chao client
Trang 835) Trong quá trình lập trình bất đồng bộ, thuộc tính AsyncState của lớp IAsyncResult chứa thông tin gì ? Đáp án: Thuộc tính này chứa thông tin của quá trình thực thi bất đồng bộ 36) Hàm Start() của lớp TcpListener tương đương với hàm gì của lớp Socket ? Đáp án: Tương đương với hàm Listen() 37) Các bước tạo ra một ứng dụng TCP server dùng các lớp helper của C# (các lớp helper như: TcpListener, TcpClient,… ) Đáp án: + Tạo ra một đối tượng TcpListener để lắng nghe kết nối + Dùng phương thức GetStream() của đối tượng TcpListener để lấy NetworkStream, NetworkStream này sẽ chịu trách nhiệm liên lạc với client + Dùng phương thức Read() và Write() của NetwokStream để đọc và gởi dữ liệu 38) Các bước tạo ra một ứng dụng TCP client dùng các lớp helper của C# (các lớp helper như: TcpListener, TcpClient,….) Đáp án: + Tạo ra một đối tượng TcpClient để kết nối với server + Dùng phương thức
GetStream() của đối tượng TcpClient để lấy NetworkStream, NetworkStream này sẽ chịu trách nhiệm liên lạc với server + Dùng phương thức Read() và Write() của NetwokStream để đọc và gởi dữ liệu 39) Các bước tạo ra một ứng dụng TCP server dùng 2 hàng đợi, 1 hàng đợi gởi và 1 hàng đợi nhận dữ liệu Đáp án: + Chờ client kết nối đến + Khi client kết nối đến, tạo ra 2 Thread, một thread Read và một thread Write Trong thread Read liên tục đọc trong bộ đệm TCP, nếu có dữ liệu thì đẩy dữ liệu này vào hàng đợi nhận Trong thread Write liên tục kiểm tra hàng đợi gởi, nếu có dữ liệu lấy dữ liệu này ra khỏi hàng đợi và gởi ra ngoài
Trang 940) Các bước tạo ra một ứng dụng TCP client dùng 2 hàng đợi, 1 hàng đợi gởi và 1 hàng đợi nhận dữ liệu Đáp án: + Thực hiện kết nối tới server + Khi kết nối tới server thành công, tạo ra 2 Thread, một thread Read và một thread Write Trong thread Read liên tục đọc trong bộ đệm TCP, nếu có dữ liệu thì đẩy dữ liệu này vào hàng đợi nhận Trong thread Write liên tục kiểm tra hàng đợi gởi, nếu có dữ liệu lấy dữ liệu này ra khỏi hàng đợi và gởi ra ngoài 41) Giải thích cách hoạt động của phương thức :
ThreadPool.QueueUserWorkItem() Đáp án: + Mỗi khi một phương thức được đưa vào
ThreadPool.QueueUserWorkItem(), nó sẽ được xếp trong hàng đợi để chờ tới lượt thực thi và khi được thực thi nó sẽ thực thi trong 1 tiểu trình mới + Nếu trong ThreadPool đang thực thi đồng thời 25 tiểu trình thì phương thức mới đưa vào sẽ nằm trong hàng đợi và chờ khi nào số tiểu trình trong ThreadPool
<25 thì nó sẽ được đưa vào thực thi 42) Trong lập trình mạng 1 server nhiều client, khi 2 ứng dụng client cùng kết nối vào 1 server thì lúc gởi trả dữ liệu về cho client làm sao ứng dụng server biết được phải gởi trả dữ liệu cho client nào ? Đáp án: Mỗi khi client kết nối tới server, server sẽ tạo ra 1 socket riêng để truyền thông với client do đó khi client gởi dữ liệu lên, trên server sẽ dùng socket này để gởi trả dữ liệu
về lại cho client nên không thể lộn client được 43) Có đoạn code TCP sau chạy ở client:
byte[] buff = new byte[1024]; string welcome = "Hello server"; buff = Encoding.ASCII.GetBytes(welcome); server.Send(buff, buff.Length, SocketFlags.None); server.Send(buff, buff.Length, SocketFlags.None);
Sau khi client thực hiện 2 lệnh send() trên server mới thực hiện lệnh Receive()
byte[] buff = new byte[1024]; byteReceive = client.Receive(buff);
Console.WriteLine(Encoding.ASCII.GetString(buff, 0, byteReceive));
Trên server kết quả sẽ xuất ra như thế nào? Giải thích?
Trang 10Đáp án: Hello serverHello server 44) Các quá trình thực thi một phương thức bất đồng bộ, cho ví dụ cụ thể Đáp án: + Gọi phương thức bắt đầu thực thi bất đồng bộ (phương thức bắt đầu bằng Begin), phương thức này yêu cầu 2 đối số: delegate AsyncCallback: tham chiếu đến phương thức thực thi bất đồng bộ, phương thức được tham chiếu đến phải trả về kiểu void và có 1 đối số là IAsynResult object: chứa thông tin của quá trình thực thi bất đồng bộ + Tạo phương thức có kiểu trả về kiểu void và có 1 đối
số là IasynResult, trong phương thức này ta dùng phương thức kết thúc thực thi bất đồng bộ để kết thúc quá trình thực thi bất đồng bộ (phương thức này bắt đầu bằng End) Ví dụ:
public static void Main() { Socket s = new Socket(); s.BeginAccept( new AsyncCallback(AcceptClient), s); } static void AcceptClient(IAsyncResult ia) { Socket s = (Socket)ia.AsyncState; socket client =
s.EndAccept(); }
45) Khi lập trình socket thì 2 namespace cần thiết để lập trình là namespace nào? Đáp án: System.Net System.Net.Socket 46) Việc gởi dữ liệu từ server đến client được thực hiện như sau:
streamWriter.WriteLine("Dang goi du lieu den client"); streamWriter.Flush();
Tại sao ta phải dùng hàm Flush()? Đáp án: Ta phải dùng hàm Flush() đẩy toàn bộ dữ liệu trong bộ đệm qua host nhận 47) Khi nào ta lựa chọn phương pháp lập trình mạng theo giao thức TCP và khi nào ta chọn phương pháp lập trình mạng theo giao thức UDP? Đáp án: