1. Trang chủ
  2. » Thể loại khác

TCP Socket Buffer

30 11 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề TCP Socket Buffer
Thể loại document
Định dạng
Số trang 30
Dung lượng 521,5 KB

Nội dung

Slide 1 1 TCP Socket BufferTCP Socket Buffer 2 TCP Socket BufferTCP Socket Buffer  Hệ điều hành Windows dùng bộ đệm TCP để gởi và nhận dữ liệu  TCP có thể gởi lại dữ liệu bất cứ lúc nào cần thiết [.]

TCP Socket Buffer TCP Socket Buffer  Hệ điều hành Windows dùng đệm TCP để gởi nhận liệu  TCP gởi lại liệu lúc cần thiết  Khi liệu hồi báo nhận thành cơng xóa khỏi đệm TCP Socket Buffer Dữ liệu đến lại đệm phương thức Receive() dùng để đọc Nếu phương thức Receive() khơng đọc tồn liệu đệm, phần cịn lại nằm chờ phương thức Receive() đọc Dữ liệu không bị không lấy liệu mong muốn TCP Socket Buffer Giao thức TCP chuyển liệu không quan tâm đến biên liệu BadTCPServer.cs using System; using System.Net; using System.Net.Sockets; using System.Text; class BadTcpServer { public static void Main() { //Số byte thực nhận dùng hàm Receive() int byteReceive; //buffer để nhận gởi liệu byte[] buff = new byte[1024]; //EndPoint cục IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); //Server Socket Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Kết nối server với EndPoint server.Bind(ipep); //Server lắng nghe tối đa 10 kết nối server.Listen(10); Console.WriteLine("Dang cho Client ket noi den "); BadTCPServer.cs //Hàm Accept() block server lại có Client kết nối đến Socket client = server.Accept(); //Client EndPoint IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Da ket noi voi Client {0} tai port {1}", clientep.Address, clientep.Port); string welcome = "Hello Client"; //Chuyển chuỗi thành mảng byte buff = Encoding.ASCII.GetBytes(welcome); //Gởi câu chào cho Client client.Send(buff, buff.Length, SocketFlags.None); for (int i = 0; i < 5; i++) { byteReceive = client.Receive(buff); Console.WriteLine(Encoding.ASCII.GetString(buff, 0, byteReceive)); } Console.WriteLine("Da dong ket noi voi Client: {0}", clientep.Address); //Đóng kết nối client.Close(); server.Close(); Console.Read(); } } BadTCPClient.cs using System; using System.Net; using System.Net.Sockets; using System.Text; class BadTcpClient { public static void Main() { //Buffer để gởi nhận liệu byte[] buff = new byte[10]; //Chuỗi nhập vào chuỗi nhận string input, stringData; //IPEndPoint server IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); //Server Socket Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } BadTCPClient.cs //Hàm Connect() bị block lại chờ kết nối với server try { server.Connect(ipep); } //Q trình kết nối xảy lỗi nên phải dùng try, catch catch (SocketException e) { Console.WriteLine("Khong the ket noi den Server"); Console.WriteLine(e.ToString()); return; } //Số byte thực nhận int byteReceive = server.Receive(buff); //Chuỗi nhận stringData = Encoding.ASCII.GetString(buff, 0, byteReceive); Console.WriteLine(stringData); server.Send(Encoding.ASCII.GetBytes("Thong diep 1")); server.Send(Encoding.ASCII.GetBytes("Thong diep 2")); server.Send(Encoding.ASCII.GetBytes("Thong diep 3")); server.Send(Encoding.ASCII.GetBytes("Thong diep 4")); server.Send(Encoding.ASCII.GetBytes("Thong diep 5")); Console.WriteLine("Dong ket noi voi server "); //Dừng kết nối, không cho phép nhận gởi liệu server.Shutdown(SocketShutdown.Both); //Đóng Socket server.Close(); Console.Read(); } } BadTCP Kết Server TCP Socket Buffer Ba kỹ thuật thông thường để phân biệt thông điệp:  Ln ln sử dụng thơng điệp với kích thước cố định  Gởi kèm kích thước thơng điệp với thông điệp  Sử dụng hệ thống đánh dấu để phân biệt thông điệp TCP Socket Buffer Chương trình Client using System; using System.Net; using System.Net.Sockets; using System.Text; class FixedTcpClient { private static int SendData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } TCP Socket Buffer Chương trình Client private static byte[] ReceiveData(Socket s, int size) { int total = 0; int dataleft = size; byte[] data = new byte[size]; int recv; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) { data = Encoding.ASCII.GetBytes("exit "); break; } total += recv; dataleft -= recv; } return data; } TCP Socket Buffer Chương trình Client public static void Main() { byte[] data = new byte[1024]; int sent; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { server.Connect(ipep); } catch (SocketException e) { Console.WriteLine("Khong the ket noi den server"); Console.WriteLine(e.ToString()); return; } int recv = server.Receive(data); string stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 1")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 2")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 3")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 4")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 5")); Console.WriteLine("Dong ket noi voi server "); server.Shutdown(SocketShutdown.Both); server.Close(); } } TCP Socket Buffer Kết Server Kết gởi nhận liệu với kích thước cố định TCP Socket Buffer GỬI KÈM KÍCH THƯỚC THƠNG ĐIỆP private static int SendVarData(Socket s, byte[] buff) { int total = 0; int size = buff.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(buff, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } TCP Socket Buffer GỬI KÈM KÍCH THƯỚC THƠNG ĐIỆP private static byte[] ReceiveVarData(Socket s) { int total = 0; int recv; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, 0); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) { data = Encoding.ASCII.GetBytes("exit "); break; } total += recv; dataleft -= recv; } return data; } TCP Socket Buffer Chương trình Server using System; using System.Net; using System.Net.Sockets; using System.Text; class VarTcpSrvr { private static int SendVarData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } TCP Socket Buffer Chương trình Server private static byte[] ReceiveVarData(Socket s) { int total = 0; int recv; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, 0); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) { data = Encoding.ASCII.GetBytes("exit "); break; } total += recv; dataleft -= recv; } return data; } TCP Socket Buffer Chương trình Server public static void Main() { byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Dang cho Client ket noi den "); Socket client = newsock.Accept(); IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Da ket noi voi client {0} tai port {1}", newclient.Address, newclient.Port); string welcome = "Hello client"; data = Encoding.ASCII.GetBytes(welcome); int sent = SendVarData(client, data); for (int i = 0; i < 5; i++) { data = ReceiveVarData(client); Console.WriteLine(Encoding.ASCII.GetString(data)); } Console.WriteLine("Dong ket noi voi Client {0}", newclient.Address); client.Close(); newsock.Close(); } } TCP Socket Buffer Chương trình Client using System; using System.Net; using System.Net.Sockets; using System.Text; class VarTcpClient { private static int SendVarData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; }

Ngày đăng: 20/04/2022, 16:46

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w