Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Cách tryền nhiều ip address thay vi ipaddress.any hoặc ipaddress.parse("127.0.0.1")?

  1. #1
    Ngày gia nhập
    03 2012
    Nơi ở
    C:\Windows\system32
    Bài viết
    9

    Wink Cách tryền nhiều ip address thay vi ipaddress.any hoặc ipaddress.parse("127.0.0.1")?

    Em có 1 đoạn code chương trình sever chat đơn giãn.

    Visual C# Code:
    1. using System;
    2. using System.Net;
    3. using System.Net.Sockets;
    4. using System.Text;
    5. class SimpleTcpSrvr
    6. {
    7.   public static void Main()
    8.   {
    9.    int recv;
    10.    byte[] data = new byte[1024];
    11.    IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); // Sever chấp nhận địa chỉ ip bất kỳ ở port 9050
    12.    Socket newsock = new
    13.      Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    14.    newsock.Bind(ipep);
    15.    newsock.Listen(10);
    16.    Console.WriteLine("Waiting for a client...");
    17.    Socket client = newsock.Accept();
    18.    IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
    19.    Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
    20.  
    21.    string welcome = "Welcome to my test server";
    22.    data = Encoding.ASCII.GetBytes(welcome);
    23.    client.Send(data, data.Length, SocketFlags.None);
    24.    while(true)
    25.    {
    26.      data = new byte[1024];
    27.      recv = client.Receive(data);
    28.      if (recv == 0)
    29.       break;
    30.    
    31.      Console.WriteLine(
    32.          Encoding.ASCII.GetString(data, 0, recv));
    33.      client.Send(data, recv, SocketFlags.None);
    34.    }
    35.    Console.WriteLine("Disconnected from {0}", clientep.Address);
    36.    client.Close();
    37.    newsock.Close();
    38.   }
    39. }
    Vấn đề đặt ra là làm sao cho sever chỉ lắng nghe và chấp nhận kết nối với 1 vài địa chỉ ip hoặc 1 range ip đã cho trước?

  2. #2
    Ngày gia nhập
    10 2010
    Nơi ở
    Biên Hòa
    Bài viết
    562

    có lẽ bạn dùng kết nối bất đồng bộ sẽ giải quyết đc vấn đề bạn đặt ra

  3. #3
    Ngày gia nhập
    03 2012
    Nơi ở
    C:\Windows\system32
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi kenturo Xem bài viết
    có lẽ bạn dùng kết nối bất đồng bộ sẽ giải quyết đc vấn đề bạn đặt ra
    Cảm ơn bạn đã reply.
    Đây là ví dụ cơ sở để làm mục tiêu hướng tới các ứng dụng khác không phải chat, giả sử giờ mình có 1 sever và 1 vài client kết nối và truyền nhận dữ liệu với nhau. Yêu cầu là không phải client nào cũng có thể kết nối được với sever (vì đây không phải chat sever nên không public) nhầm nâng cao tính bảo mật chút xíu thôi ạ!

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn cứ listen any, sau khi accept xong thì kiểm tra ip, thấy ko hợp thì close.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    09 2011
    Bài viết
    22

    Giải quyết vấn đề của bạn theo mình có 2 cách:
    +>Chấp nhận client kết nối thủ công bằng cách hiển thị thông báo cho người quản lý
    Và mỗi khi một client bị từ chối thì ip của client đó sẽ được lưu trữ vào trong một Collection để lần sau client đó connect đến ta chỉ việc kiểm tra bên trong collection có chứa ip đó không nếu không thì lại hiển thị thông báo tùy chọn cho người quản lý
    --- > Hơi phức tạp nhưng được cái linh động
    +>Tạo ra một danh sách các ip bị loại và lưu vào collection ,mỗi khi client connect tới thì kiểm tra như trên nhưng không cần hiển thị thông báo tùy chọn
    ---> Fix cứng không linh động

  6. #6
    Ngày gia nhập
    03 2012
    Nơi ở
    C:\Windows\system32
    Bài viết
    9

    Mặc định Cách tryền nhiều ip address thay vi ipaddress.any hoặc ipaddress.parse("127.0.0.1")?

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Bạn cứ listen any, sau khi accept xong thì kiểm tra ip, thấy ko hợp thì close.
    Cảm ơn bạn đã quan tâm, cách của bạn có lẽ được đó, nhưng mình thấy nếu làm vậy thì hơi tốn băng thông và năng lực CPU vì phải tạo kết nối (socket), chấp nhận kết nối và close kết nối. (giả sử có nhiều client không được phép kết nối kết nối vào sever cùng lúc thì hơi mệt).
    Ông thầy mình có gợi ý là dùng IPHostEntry, nhưng không chỉ cụ thế cách viết :(

  7. #7
    Ngày gia nhập
    03 2012
    Nơi ở
    C:\Windows\system32
    Bài viết
    9

    Giả sử đây là code sever:
    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    
    namespace The_SimpleTcpSrvr
    {
        class Program
        {
            public static void Main()
            {
                int recv;
                byte[] data = new byte[1024];
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("10.0.0.1"), 9050); 
                Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                newsock.Bind(ipep);
                newsock.Listen(10);
                Console.WriteLine("Waiting for a client...");
                Socket client = newsock.Accept();
                IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
                Console.WriteLine("Connected with {0} at port {1} ", clientep.Address, clientep.Port);
                string welcome = "Welcome to Giang's test server";
                data = Encoding.ASCII.GetBytes(welcome);
                client.Send(data, data.Length, SocketFlags.None);
                while (true)
                {
                    data = new byte[1024];
                    recv = client.Receive(data);
                    if (recv == 0)
                        break;
                    Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
                    client.Send(data, recv, SocketFlags.None);
                }
                Console.WriteLine(" Disconnect from {10}", clientep.Address);
                client.Close();
                newsock.Close();
            }
        }
    }
    đây là code client (có thể có nhiều client chạy chung 1 code này)

    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net.Sockets;
    using System.Net;
    
    namespace The_SimpleTcpClient
    {
        class The_SimpleTcpClient
        {
            public static void Main()
            {
                byte[] data = new byte[1024];
                string input, stringData;
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("10.0.0.1"), 9050);
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    server.Connect(ipep);
                }
                catch (SocketException e)
                {
                    Console.WriteLine("Unable to connect to server.");
                    Console.WriteLine(e.ToString());
                    return;
                }
                int recv = server.Receive(data);
                stringData = Encoding.ASCII.GetString(data, 0, recv);
                Console.WriteLine(stringData);
                while (true)
                {
                    input = Console.ReadLine();
                    if (input == "exit")
                        break;
                    server.Send(Encoding.ASCII.GetBytes(input));
                    data = new byte[1024];
                    recv = server.Receive(data);
                    stringData = Encoding.ASCII.GetString(data, 0, recv);
                    Console.WriteLine(stringData);
                }
                Console.WriteLine("Disconnecting from server........");
                server.Shutdown(SocketShutdown.Both);
                server.Close();
            }
        }
    }
    Theo như bài này, sever sẽ chỉ chấp nhận client có ip 10.0.0.1, ip khác thì bị drop ngay. khác với bài trước là sever chấp nhận bất kì ip nào cũng có thể kết nối.
    Và nhu cầu là tập trung chủ yếu xử lý đoạn code màu đỏ làm sao cho sever chấp nhận kết nối nếu client có ip là 1.0.0.1, 10.0.0.2, 10.0.0.3. khác thì drop.
    Ông thầy ổng có gợi ý dùng IPHostEntry nhưng không chỉ cụ thể. Hix. Có bạn nào có cao kiến gì không?

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Cách của bạn chỉ áp dụng cho 1 số lượng ít IP được thôi, nhiều IP thì mình nghĩ tốc độ cũng ko nhanh. Nếu bạn accept xong xét điều kiện rồi close cũng ko tốn cpu và network bao nhiêu cả. Mình đã từng test thì thấy 2000 kết nối tới rồi bị đóng liên tiếp cũng chẳng nhằm nhò gì đến server. Nếu bạn muốn chặn trước cả accept thì phải dùng firewall filter hoặc ip table mới mong chặn được. Ở mức bình thường thì giải phải accept/close là khả thi và có hiệu năng tốt nhất.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    Ngày gia nhập
    03 2012
    Nơi ở
    C:\Windows\system32
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Cách của bạn chỉ áp dụng cho 1 số lượng ít IP được thôi, nhiều IP thì mình nghĩ tốc độ cũng ko nhanh. Nếu bạn accept xong xét điều kiện rồi close cũng ko tốn cpu và network bao nhiêu cả. Mình đã từng test thì thấy 2000 kết nối tới rồi bị đóng liên tiếp cũng chẳng nhằm nhò gì đến server. Nếu bạn muốn chặn trước cả accept thì phải dùng firewall filter hoặc ip table mới mong chặn được. Ở mức bình thường thì giải phải accept/close là khả thi và có hiệu năng tốt nhất.
    Giả sử bạn đi học, ông thầy ổng đưa ra cái hướng đó, kêu bạn về tiếp tục nghiên cứu cho hoàn thiện, hôm sau sẽ hỏi vấn đề này và cho điểm, theo bạn bạn sẽ làm như thế nào

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi theClassicMan27 Xem bài viết
    Giả sử bạn đi học, ông thầy ổng đưa ra cái hướng đó, kêu bạn về tiếp tục nghiên cứu cho hoàn thiện, hôm sau sẽ hỏi vấn đề này và cho điểm, theo bạn bạn sẽ làm như thế nào
    Rất tiếc là mình thua, khó đỡ quá.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Các đề tài tương tự

  1. Lập trình chat client winform trong c#, IPEndPoint(IPAddress.Any, 65534) nghĩa là gì?
    Gửi bởi nkhoa295 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 22-08-2011, 10:43 AM
  2. Design conflict, chọn "tình anh em" hay "trách nhiệm"?
    Gửi bởi longtth trong diễn đàn Kinh nghiệm CNTT
    Trả lời: 14
    Bài viết cuối: 18-04-2011, 12:34 PM
  3. Problems : " recover tree " with input as " preorder" and "inorder"
    Gửi bởi HoangManhHa1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 13-04-2011, 10:19 PM
  4. Kỹ thuật C++ Toán tử thao tác bit.. "&"(và bit), "|"(hay bit), "^"(hoặc bit). là gì!
    Gửi bởi quan_pc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 20-02-2011, 08:05 PM
  5. tại sao nó báo "parse error before '{'" nhỉ ?
    Gửi bởi anhdung88 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 13-04-2008, 06:58 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn