Showing posts with label Code. Show all posts

CHAT LAN C#. Phần 2: Code máy chủ (Server). Xử lí việc gửi nhận với nhiều máy khách

thuvienwinform - Để thực xây dựng chương trình gửi tin nhắn qua mạng LAN cần có một chương trình chạy trên máy chủ. Chức năng chính của nó là: Nhận kết nối từ các máy khách, sau khi tạo được kết nối thì bắt đầu việc gửi/nhận dữ liệu giữa máy chủ và máy khách. Khi nhận được dữ liệu (văn bản, hình ảnh, âm thanh,..) thì sẽ được xử lí trên máy chủ này. Có thể là lưu vào CSDL hoặc thực hiện các lệnh nhận được từ máy khách như gửi cho họ một tài liệu, hình ảnh, đoạn phim,...

Phần 1: [CHAT LAN] Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN

Tải project: https://www.dropbox.com/s/tydku6em1cjq8mb/thuvienwinform-CHATLANServer.rar (21KB)




Máy chủ dùng IP hiện tại của máy. Tham khảo thêm cách lấy IP này: http://thuvienwinform.blogspot.com/2013/10/code-lay-username-va-ip-cua-may.html


Cụ thể thì các bước để xây dựng một máy chủ như sau:
1/ Tạo (mở) một cổng kết nối logic (socket) để cho các máy khách tham gia gửi/nhận tin băng cổng này
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
3/ Thực hiên giao tiếp với máy khách: Nhận dữ liệu từ máy khách, phân tích, xử lí sau đó gửi lại co máy khách. (lưu vào CSDL, chống nói tục@!, ...)
4/ Đóng socket



- Các code chat mạng LAN trên mạng thường thì bước 2 chỉ chấp nhận được 1 kết nối. Để chấp nhận nhiều kết nối thì ta cho bước 2 vào vòng lặp, khi kết nối thêm 1 khách sẽ chuyển bước 3 sang 1 luồng (thread) khác giao tiếp với máy khách đó.

- Trong này sử dụng khá nhiều về thread. Có thể xem thêm ở bài Thread trong C#: http://thuvienwinform.blogspot.com/2014/04/thread-trong-csharp.html


Các biến:

//Địa chỉ mặc định
string IP = "127.0.0.1";
int PORT = 100;

//Các luồng
Thread thKetNoiDenServer, thKetNoiTaoServer, thLienLacKhach;
TcpListener langNghe;

//Biến dùng để gửi, nhận dữ liệu
byte[] dlNhan = new byte[1024];
byte[] dlGui = new byte[1024];

//Socket tạo server và kết nối
Socket socket;
//Tạo 1 socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//Danh sách các máy khách kết nối đến
List cacMay = new List();

1/ Tạo (mở) một cổng kết nối logic (socket)

//Tạo 1 socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(IP), PORT);//IP = "127.0.0.1"; PORT = 100;
//Liên kết cổng s với địa chỉ IP và cổng
s.Bind(iep);
//Nhận tín hiệu từ các máy kết nối
s.Listen(10);

Nếu có 1 IP tĩnh mua với nhà mạng thì chương trình này trở thành chat online luôn đó :)
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách


//Thêm máy khách
socket = s.Accept();

//Lưu máy khách được thêm vào danh sách. Để dễ quản lí
cacMay.Add(socket);

//Thông báo kết nối với máy khách
txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n";

//Mỗi máy khách sẽ được xử lí trong 1 luồng (thread)
ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket);

với List cacMay = new List();
Cài tiến code bước 2 này để nhận được kết nối từ nhiều máy khách:

//Trong khi còn kết nối. Mỗi khi có tín hiệu từ máy khách đến sẽ thêm vào -> nhận đc nhiều máy khách cùng lúc
while (true)
{
    //Thêm máy khách
    socket = s.Accept();

    //Lưu máy khách được thêm vào danh sách. Để dễ quản lí
    cacMay.Add(socket);

    //Thông báo kết nối với máy khách
    txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n";

    //Mỗi máy khách sẽ được xử lí trong 1 luồng (thread)
    ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket);
}


3/ Thực hiên giao tiếp với máy khách

- Nhận văn bản gửi đến lưu vào biến tạm tmp

string tmp = "";
byte[] dlNhan = new byte[1024];
socket.Receive(dlNhan);
tmp = Encoding.Unicode.GetString(dlNhan);

- Gửi văn bản đến các máy khách:

foreach (Socket s in cacMay)
{
    s.Send(Encoding.Unicode.GetBytes(noiDung));
}

Để gửi được hình ảnh thì ta chuyển ảnh thành byte[] xong cũng gửi bình thường. Xem cách chuyển: http://thuvienwinform.blogspot.com/2014/03/code-up-anh-len-csdl-su-dung-kieu-image-trong-sqlserver.html
4/ Đóng socket


Khach.Close();


Để chương trình hoạt động thì ngày mai sẽ có project máy khách cho các bạn nha :)
19-5-2015: Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
4/18/2014
Đăng bởi :
Nhãn : ,

CHAT LAN C#. Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN

thuvienwinform - C# hỗ trợ chúng ta lập trình mạng rất tốt, cụ thể là có thư viện System.Net. Qua đó chúng ta có thể xây dựng những ứng dụng hữu ích để gửi, nhận dữ liệu qua mạng. Một ví dụ điển hình cho việc lập trình mạng là chương trình gửi tin nhắn (chat) qua mạng LAN. Cũng đơn giản thui từ từ từng bước một là OK. Để xây dựng chương trình này trước hết chúng ta cần tìm hiểu về giao thức hoạt động để gửi/nhận dữ liệu TCP và System.NET

1. TCP

Wikipedia:
- TCP là giao thức cốt lõi của bộ giao thức TCP/IP. Sử dụng TCP, ử dụng TCP, các ứng dụng trên các máy chủ được nối mạng có thể tạo các "kết nối" với nhau, mà qua đó chúng có thể trao đổi dữ liệu hoặc các gói tin. Giao thức này đảm bảo chuyển giao dữ liệu tới nơi nhận một cách đáng tin cậy và đúng thứ tự. TCP còn phân biệt giữa dữ liệu của nhiều ứng dụng (chẳng hạn, dịch vụ Web và dịch vụ thư điện tử) đồng thời chạy trên cùng một máy chủ. Xem thêm...
- TCP hỗ trợ nhiều giao thức ứng dụng phổ biến trên Internet và các ứng dụng kết quả như www, thư điện tử,...
- TCP như kiểu 2 hay nhiều người nói chuyện với nhau. Một người  hỏi: "Mày có nghe rõ không" nếu thằng kia trả lời "Có" thì mới thực hiện trò chuyện. Vì vậy TCP đảm bào việc truyền dữ liệu

- Mỗi máy tính có một địa chỉ IP => phân biệt các máy qua địa chỉ IP. Mỗi chương trình trên máy có một cổng kết nối => phân biết các chương trình bằng cổng kết nối. => để gửi dữ liệu cho một chương trình trên máy tính cần có địa chỉ ip của máy và cổng của chương trình đó

- Ngoài TCP thì trong bộ giao thức TCP/IP còn có thêm giao thức UDP. Cái này nó truyền tín hiệu nhanh hơn TCP nhưng tín hiệu truyền đi lại được cho phép mất, không biết thèn kia có nhận được hay chưa. Bù lại thì nó truyền nhanh hơn. Như trong ví dụ 2 thằng nói truyện ở trên, với UDP thì không cần thằng kí trả lời có ta vẫn cứ nói, mặc kệ có nghe tao hay không :D. Giống như kiểu gửi email cho 1 thằng offline, không biết nó có nhận và đọc hay không

- Tài liệu về giao TCP và IP:  https://docs.google.com/document/d/1GR39aiMkP1giKa9Brppbc9loHB2YaQ5QjD0ZX_M2YLo/edit?hl=en

2. System.NET


- Để xây dựng chương trình chat qua mạng LAN ta cần sử dụng: IPEndPoint, Socket, TcpClient, IPAdress

Ở phần tiếp thuvienwinform sẽ mang đến project dành cho máy chủ trong chương trình chat qua mạng LAN.

19-5-2015:
Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!

Thread trong C#

thuvienwinform - Thread cho phép thực hiện cùng lúc nhiều công việc song song với nhau mà không bị đơ, lag (lác :D), gián đoạn. Nó đặc biệt quan trọng trong lập trình mạng, các ứng dụng đỏi hỏi thực hiện công việc nặng nhọc, duyệt vòng lặp lớn (lặp vài trăm nghìn lần như duyệt các thư mục), nếu không dùng thread thì chương trình sẽ không thể tương tác được, có thể rơi vào trạng thái không phản hồi (Not Responding - Cái này quen quen). Nhờ có Thread mà ứng dụng trở nên mượt hơn, hạn chế đơ, lag, sử dụng CPU hiệu quả hơn với lập trình winform.



- Để sử dụng thread ta khai báo using System.Threading;
- Số thread tối đa cho 1 chương trình:
+ Với .NET2.0 là 25.
+ Với .NET3.5 là 250.
+ Với .NET4.0 (32bit) là 1023.
+ Với .NET4.0 (64bit) là 32768.
+...

1/ Tạo thread mới để chạy 1 hàm, thủ tục
- Cho hàm, thủ tục không có tham số truyền vào

Thread t1;
t1 = new Thread(ThuTuc1);
với ThuTuc1 là một thủ tục (void) không có tham số truyền vào

Các ví dụ dưới đây sẽ dùng thread t1 này là ví dụ ạ

- Cho hàm, thủ tục có tham số truyền vào (Sử dụng Lambda Expresstion)

t1 = new Thread();
t1 = new Thread((ThreadStart) =>
    {
        ThuTuc2("Truyen vao");
    });
2/ Chạy thread đó
- Sau khi tọa được thread rùi ta có thể cho nó bắt đầu chạy:

t1.Start();

3/ Dừng thread

t1.Abort();

4/ Tạm dừng thread

t1.Suspend();
Tạm dừng cho đến khi
t1.Resume();


5/ Mức độ ưu tiên của thread (Thread Priority)
- Khi sử dụng nhiều thread thì ta cài đặt độ ưu tiên thực thi của các thread

t1.Priority = ThreadPriority.Lowest;
- Có các giá mức ưu tiên: Lowest, BelowNormal, Normal, AboveNormal, Hightest


6/ Join
- Cái này nó sẽ làm như sau: Những thread dưới câu lệnh Join() sẽ được start sau khi các thread trên câu lệnh join chạy xong

7/ Thoát chương trình nhưng thread vẫn chạy
- Thread có 2 loại: ForeGround và BackGround.
+ Chương trình sẽ tắt khi các ForeGround thread chạy xong
+ Còn các BackGroud Thread sẽ dừng lại khi tắt chương trình.

- Lí do là khi ta tạo 1 thread nó mặc định là loại ForeGround
- Để khi tắt chương trình các thread cũng dừng thì ta sẽ chuyển các thread sang BackGround như sau:

t1.IsBackground = true;
t1.Start();
Chuyển thread thành background trước khi start

8/ Thread Pooling
- Cái này hơn rất rất nhiều. Có thể nói nó tối ưu thread.
- Thread Pooling mặc định là loại BackGround
- Sau khi kết thúc một tác vụ nó sẽ trở về trạng thái sẵn sàng nhận một nhiệm vụ mới
- Chạy một thủ tục, hàm bằng Thread Pooling (thủ tục, hàm phải có đầu vào là 1 Object)

private void Button1_Click()
{
    ThreadPool.QueueUserWorkItem(ThreadPooling, "Test");
   //Hoặc: ThreadPool.QueueUserWorkItem(ThreadPooling);
}
private void ThreadPooling(object obj)
{
    MessageBox.Show(obj.ToString());
}

Nguồn: YinYang's Blog

[ENCODING] Chuyển đổi qua lại giữa các loại mã (Unicode-UTF8-UTF7-ASCII...)

Chào !
Hôm nay mình sẽ hướng dẫn các bạn chuyển đổi các loại mã (Unicode-UTF8-UTF7-ASCII...)
Các bạn có thể hoàn toàn tạo được 1 tool giúp chuyển đổi các loại mã trong Văn bản ^^!
(Ví dụ bạn dùng MS Word đã lỡ dùng Unicode nhưng người ta yêu cầu phải dùng định dạng ASCII hết chẳng hạn ... )

OK. Bắt đầu nhé !
Ở đây mình sẽ ví dụ chuyển mã Unicode sang mã UTF8 :

1. Hãy "using System.Text" để sử dụng lớp Encoding

2. Chuyển dữ liệu về mảng byte :

// Chuyển string szDuLieuUniCode về dạng mảng byte
byte[] unicode = Encoding.Unicode.GetBytes(szDuLieuUniCode);
// Cover byte unicode sang byte utf8
byte[] utf8 = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, unicode);
// chuyển từ mảng byte utf8 về dạng string
string szDuLieuUTF8 = Encoding.UTF8.GetString(utf8);

OK Vậy là đã xong !
4/17/2014
Đăng bởi :
Nhãn :

[API] Ini - Ghi các setting cực tốt !

Với một phần mềm có chức năng tùy chỉnh thì việc lưu các setting là rất quan trọng.
Hôm nay mình xin hướng dẫn các bạn một trong các kiểu ghi/đọc các setting cực kì phổ biến -- Đọc/Ghi Ini

1. Tổng quan một file ini
1 file được ghi theo kiểu Ini sẽ có dạng sau đây :
[Section]
Key=Value

Ví dụ mình muốn lưu cái "Tự động đăng nhập" cho phần mềm của mình thì File ini sẽ có dạng sau :
[TuDongDangNhap]
KichHoat=1
TaiKhoan=buiducduy111

2. Thực hiện trong C#

2.1 . Đừng quên " using System.Runtime.InteropServices;" để có thể sử dụng các hàm API
2.2. Sử dụng DLL :  kernel32

[DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
        [DllImport("kernel32")]
        private static extern long GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filepath);

OK vậy là bạn có thể Đọc/Ghi dữ liệu từ file setting theo cách trên

Nếu chưa làm được hãy xem code dưới đây (Bạn chỉ cần sử dụng INI.READ và INI.WRITE thôi)
public class INI
    {
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
        [DllImport("kernel32")]
        private static extern long GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filepath);

                      // Viết thêm 2 hàm mới cho dễ  
        public static string READ(string szFile, string szSection, string szKey)
        {
            StringBuilder tmp = new StringBuilder(255);
            long i = GetPrivateProfileString(szSection, szKey, "", tmp, 255, szFile);
            return tmp.ToString();
        }
        public static void WRITE(string szFile, string szSection, string szKey, string szData)
        {
            WritePrivateProfileString(szSection, szKey, szData, szFile);
        }
    }

3. Thực hành
Ví dụ : (Sử dụng class INI được xây dựng bên trên)
INI.WRITE("Data.ini","TuDongDangNhap","TaiKhoan", "buiducduy");
INI.WRITE("Data.ini","TuDongDangNhap","KichHoat", "1");
Kết quả trong Data.ini :
[TuDongDangNhap]
TaiKhoan=buiducduy111
KichHoat=1

string s = INI.READ("Data.ini","TuDongDangNhap","TaiKhoan");
MessageBox.Show(s);
Kết quả "buiducduy";

OK. Nếu chưa hiểu bạn cứ comment ở dưới nhé!

4/14/2014
Đăng bởi :
Nhãn : ,

[SOFTWARE DESIGN] Thiết kế phần mềm theo mô hình 3 lớp Layer

Hướng tới lập trình chuyên nghiệp (nói cho oai chứ mình gà lắm) - không chỉ về mặt code , thuật toán ... mà bạn cần phải thiết kế phần mềm sao cho dễ chỉnh sửa , cập nhật nhất (nhất là đối với code team và bạn đã định hướng phát triển phần mềm lâu dài)

Hôm nay mình xin giới thiệu một cách thiết kế khá phổ biết là "MÔ HÌNH 3 LỚP LAYER"

1. Giới thiệu tổng quan
Như tên của mô hình. Chúng ta sẽ thiết kế phần mềm theo 3 lớp sau :
- GUI Layer : chuyên xử lí về GUI (giao diện)
- Business Layer : chuyên xử lí về nghiệp vụ, thuật toán....
- Data Access Layer : đưa dữ liệu xuống cơ sở dữ liệu cũng như lấy dữ liệu từ cơ sở dữ liệu lên

Ngoài ra chúng ta dùng thêm 1 class là : Data Transfer Object (DTO) có chức năng là cầu nối giữa các Layer. (Ta cũng có thể dùng các parameter để truyền dữ liệu , tùy nhiên nhiều parameters quá thì nên dùng tên class này)

2. Các bước thiết kế phần mềm theo mô hình 3 lớp layer
Bây giờ chúng ta cùng nhau thiết kế một phần mềm đơn giản nhé ^^

Để đơn giản ở đây tôi không dùng hệ quản trị cơ sở dữ liệu mà ghi dữ liệu ra file "Data.txt"  (Coi như nó là DataBase đi :D -- File này sẽ chỉ ghi được 1 tài khoản thôi nhưng đây là ví dụ mà -- các bạn có thể áp dụng vào các hệ quản trị CSDL giống như vậy)

- Thiết kế một GUI như sau :
GUI có 2 textbox : txtTaiKhoan và txtMatKhau và một button : btnDangKi

- Tạo các Folder vào các class như hình dưới đây :
(GUI Layer : frmRegister.cs | Business Layer : XuLi.cs | Data Access Layer : VanChuyenDuLieu.cs
và DTO.cs)
- OK Tiến hành code nhé :

** DTO.cs (Nơi đây chỉ chứa các biến vận chuyển) :

namespace MOHINH3LOPLAYER
{
    public class DTO
    {
        private string _TaiKhoan;
        private string _MatKhau;
        public string TaiKhoan
        {
            set {_TaiKhoan = value;}
            get {return _TaiKhoan;}
        }
        public string MatKhau
        {
            set {_MatKhau = value;}
            get {return _MatKhau;}
        }
    }
}


**VanChuyenDuLieu.cs (Nơi đây chỉ có chức năng đọc/ghi dữ liệu xuống CSDL)
Ở phương thức GhiDuLieu tôi sẽ truyền vào đối tượng DTO
namespace MOHINH3LOPLAYER.Data_Access_Layer
{
    public class VanChuyenDuLieu
    {
        public static void GhiDuLieu(DTO doituong)
        {
            FileStream fs = new FileStream("Data.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine(doituong.TaiKhoan);
            sw.WriteLine(doituong.MatKhau);
            sw.Flush();
            sw.Close();
        }
    }
}
** XuLi.cs (Nơi đây chỉ có chức năng xử lí thuật toán)

namespace MOHINH3LOPLAYER.Business_Layer
{
    public class XuLi
    {
        private static bool KiemTra(DTO doituong)
        {
            if (doituong.TaiKhoan != "" && doituong.MatKhau != "")
                return true;
            return false;
        }
        public static bool DangKi(DTO doituong)
        {
            if (!KiemTra(doituong))
                return false;
            MOHINH3LOPLAYER.Data_Access_Layer.VanChuyenDuLieu.GhiDuLieu(doituong);
            return true;
        }
    }
}

** Và cuối cùng là Xử lí nút "Đăng kí ở GUI" như sau :

private void btnDangKI_Click(object sender, EventArgs e)
        {
                         // Tạo đối tượng DTO
            DTO doituong = new DTO();
            doituong.TaiKhoan = this.txtTaiKhoan.Text;
            doituong.MatKhau = this.txtMatKhau.Text;

            if (MOHINH3LOPLAYER.Business_Layer.XuLi.DangKi(doituong))
            {
                MessageBox.Show("Đăng kí thành công");
            }
            else
            {
                MessageBox.Show("Đăng kí thất bại");
            }
        }

OK như vậy là xong ^^! Đơn giản đúng không :D

Đăng bởi :

Code quay lui bằng C# tìm tổ hợp, chỉnh hợp chập k của n

thuvienwinform - Thuật toán trâu bò quen thuộc và khá hữu ích trong việc code. Để tìm tổ hợp đơn giản là tìm một dãy số thỏa mãn điều kiện sau:
- Các số đều khác nhau
- Số sau lớn hơn số trước
- Các bộ số không trùng lặp nhau
-...

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace QuayLuiTimToHop
{
    class Program
    {
        #region Khai báo
        static int n, k;
        static int[] a, dau;
        #endregion

        #region THủ tục
        private static void Xuat(int i)
        {
            for (int j = 1; j <= k; j++)
                Console.Write(a[j] + " ");
            Console.WriteLine();
        }

        private static void Duyet(int i)
        {
            if (i > k) Xuat(i);
            else
            {
                int j;
                for (j = a[i - 1]; j <= n; j++)
                {
                    if (dau[j] == 0)
                    {
                        a[i] = j;
                        dau[j] = 1;
                        Duyet(i+1);
                        dau[j] = 0;
                    }
                }
            }
        }
        #endregion

        static void Main(string[] args)
        {
            #region Đầu vào
            Console.Write("Nhap va n: ");
            n = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nhap va k: ");
            k = Convert.ToInt32(Console.ReadLine());
            a = new int[n+1];
            dau = new int[n+1];
            for (int i = 0; i < n + 1; i++)
                dau[i] = 0;
            #endregion

            #region Xử lí
            Console.WriteLine("To hop chap " + k + " cua " + n + ": ");
            a[0] = 1;
            Duyet(1);
            #endregion

            Console.ReadKey();
        }
    }
}
Dãy cần tìm là a
Thuật toán quay lui với vòng lặp sẽ bắt đầu từ a[i-1] đề thỏa mãn điều kiện các số khác nhau và số sau lớn hơn số trước. Trong quá trình duyệt kết hợp đánh dấu phần tử đã sử dụng để không bị trùng (ở trong này mình dùng mảng dau)
Khi tìm đủ k phần tử cho mảng a thì xuất ra.

Về lí thuyết quay lui có thể tham khảo trong sách giải thuật và lập trình của Lê Minh Hoàng

Với code này chuyển thành tính chỉnh hợp cũng không có gỉ cả, chỉ cẩn thay vòng lặp thành thế này là OK
Các số trong bộ số sẽ không phải là từ a[i-1] nữa mà là từ 1

for (j = 1; j <= n; j++)
{
    if (dau[j] == 0)
    {
        a[i] = j;
        dau[j] = 1;
        Duyet(i+1);
        dau[j] = 0;
    }
}
4/13/2014
Đăng bởi :
Nhãn :

[API] Phát nhạc MP3

Như chúng ta đã biết thư viện "System.Media" chỉ cho phép chạy file âm thanh ".wav" nhiều chúng ta chạy file MP3 rất khó khăn (làm một chương trình phát nhac đơn giản chẳng hạn -- không dùng dll của Windows Media đâu nhé)

Hôm nay mình sẽ hướng dẫn các bạn sử dụng API để chạy file MP3 trong C#.
Các bước như sau :

1. Đừng quên "using System.Runtime.InteropServices;" để sử dụng API nhé.

2. Import Dll "winmm.dll"
[DllImport("winmm.dll")]

private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

Hàm API này không hẳn có chức năng chạy MP3 mà nó là 1 hàm cho phép thực hiện câu lệnh được Coder đưa vào qua 1 string là strCommad . như vậy parameters này là quan trọng nhất (và mình cũng không biết các param khác có chức năng gì -- thôi thì cứ null -- API thường vậy mà HIHI ^^)

3. Giới thiệu các Commad để chạy 1 file MP3
- Mở MP3 :  "open "Đường dẫn tới file mp3" type mpegvideo alias MediaFile"
ví dụ : "open "E:\MUSIC\nhac.mp3" type mpegvideo alias MediaFile"
- Chạy MP3 vừa mở :  "play MediaFile"
Có thể dùng "play MediaFile REPEAT" để phát đi phát lại file MP3 vừa mở
- Dừng MP3 : "close MediaFile"


Nếu chưa làm được hãy xem ví dụ này :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MP3
{
    public partial class Form1 : Form
    {
        public bool isOpen = false;

        public Form1()
        {
            InitializeComponent();
        }
                  // Import Dll này vô
        [DllImport("winmm.dll")]'

        private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

        // BUTTON PLAY MP3
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog op = new OpenFileDialog();
            op.Filter = "MP3 (*.mp3)|*.mp3";
            if (op.ShowDialog() == DialogResult.OK)
            {
                string szFile = op.FileName;
                MP3Open(szFile); 
                Mp3Play(false);
            }
        }
        // BUTTON STOP MP3
        private void button2_Click(object sender, EventArgs e)
        {
            Mp3Close();
        }

        // PHẦN XỬ LÍ ----------------------------------------------------------------------------------
        public void MP3Open(string szFileName)
        {
            string szCommad = "open \"" + szFileName + "\" type mpegvideo alias MediaFile";
            MessageBox.Show(szCommad);
           mciSendString(szCommand, null, 0, IntPtr.Zero);
            isOpen = true;
        }
        public void Mp3Close()
        {
            string szCommand = "close MediaFile";
            mciSendString(szCommand, null, 0, IntPtr.Zero);
            isOpen = false;
        }

        public void Mp3Play(bool isLoop)
        {
            if (isOpen)
            {
                string szCommand = "play MediaFile";
                if (isLoop) szCommand += " REPEAT";
                mciSendString(szCommand, null, 0, IntPtr.Zero);
            }
        }
    }
}

Đăng bởi :
Nhãn : ,

[API] Kiểm tra kết nối Internet

Trong nhiều chương trình, chúng ta cần thao tác với Server qua Network , song nếu máy tính chưa kết nối Internet thì chương trình rất có thể bị "Treo" do cố gắng làm những công việc bạn code (Đơn giản như chương trình gửi mail - hãy thử ngắt kết nối Internet và chạy chương trình :D)

Hôm nay mình sẽ hướng dẫn các bạn làm sao để kiểm tra máy tính có đang kết nối Internet !

1. Nhớ "using System.Runtime.InteropServices;"  để có thể sử dụng API

2. Import DLL "wininet.dll"
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

Ở đây hàm này sẽ trả về true nếu có kết nối internet và false nếu không ^^!


* Nếu các bạn chưa làm được có thể xem ví dụ dưới đây

    public class INTERNET
    {
        [DllImport("wininet.dll")]
        private extern static bool InternetGetConnectedState(out int Description, int                                                                                                                                        ReservedValue);
        public static bool ISINTERNETCONNECTED()
        {
            int des;
            if (InternetGetConnectedState(out des, 0) == true)
                return true;
            return false;        }
   }





Đăng bởi :
Nhãn : ,

Code gửi thư bằng gmail

thuvienwinform - Ứng dụng của nó khá nhiều ví dụ như báo lỗi sản phẩm, liên hệ tác giả, lấy key,...Trong code mình dùng máy chủ smtp của google. Các bạn có thể dùng các máy chủ khác hỗ trợ smtp như OutLook nhưng khi đó địa chỉ máy chủ và cổng sẽ khác, chỉnh lại là OK. Nếu code không hoạt động thì bạn tham khảo cách cài đặt tài khoản Gmail để smtp hoạt động ở bài: http://thuvienwinform.blogspot.com/2014/03/tfs-thiet-lap-email-thong-bao-alert-cho-team-foundation-server-bang-gmail-hoac-live-mail-giup-cap-nhat-cong-viec-kip-thoi.html

Project demo: https://www.dropbox.com/s/ey7fksmiddqjpkm/thuvienwinform-GuiThu.rar (26KB)

Sử dụng 2 thư viện:
+ using System.Net.Mail;
+ using System.Net;
để thực hiện công việc này

Code:
  
private void GuiThu(string diachigui, string matkhau, string diachinhan, string tieude, string noidung)
{
//using System.Net.Mail;
//using System.Net;
    #region Tạo nội dung thư
    MailMessage mail = new MailMessage(diachigui, diachinhan, tieude, noidung);
    #endregion

    #region Cấu hình smtp
    SmtpClient smtp = new SmtpClient()
    {
        //Máy chủ smtp
        Host = "smtp.gmail.com",
        //Cổng gửi thư
        Port = 587,
        //Tài khoản Gmail
        Credentials = new NetworkCredential(diachigui, matkhau),
        EnableSsl = true
    };
    #endregion

    #region Gửi thư
    smtp.Send(mail);
    #endregion
} 
4/08/2014
Đăng bởi :
Nhãn :

Code một số thao tác đơn giản với xử lí hình ảnh: tăng độ sáng, độ tương phản, đổ màu,...



thuvienwinform - C# hỗ trợ chúng ta thư viện System.Drawing. Dựa vào đó chúng ta có thể thực hiện một số thao tác cơ bản với hình ảnh như thiết lập độ sáng, độ tương phản, xoay hình ảnh, hay tạo ảnh đen trắng,...Hôm nay mình xin được giới thiệu một số thao tác xử lí hình ảnh đơn giản thông qua lớp Bitmap trong System.Drawing


1. RGB
- Có thể hiểu nó là một bộ 3 số (R, G, B) nằm trong đoạn từ 0 -> 255. Mỗi số đại diện cho màu đỏ (Red - R), Xanh là cây (Green - G), Xanh lam (Blue). Bất kì màu nào cũng có thể được biểu diễn bằng bộ ba số này!
VD:
\
Màu đen: (0, 0, 0)
Màu đỏ: (255, 0, 0)
...
- Với hình ảnh (Image) nó được chia ra thành các pixel (điểm ảnh), mỗi pixel là một bộ ba số theo mô hình RGB này. Số pixcel = (chiều rộng)x(chiều cao).
- Trong C# để xử lí với các pixel này ta sử dụng lớp Bitmap trong System.Drawing (using System.Drawing)
- Cách làm chính là duyệt từng pixel và thực hiện các thao tác mong muốn trên các pixel đó để thu được bức ảnh mong muốn

2. Một số hàm, biến cơ bản
- Khai báo 1 Bitmap:
Bitmap bitmap = new Bitmap(anh);//anh là kiểu Image
Bitmap bitmap = new Bitmap(chieurong, chieucao);//chieucao, chieurong là kích thước của bitmap này
VD
Bitmap bitmap = new Bitmap(200, 200);//ảnh có kích thước 200x200

- Color:
Color c;//Bản ghi color. Khi đó bộ ba số RGB sẽ là: c.R, c.G, c.B
Color.FromArgb(r, g, b);//Lấy màu từ bộ ba số RBG
VD: màu đen
Color.FromArgb(0, 0, 0);//Màu đen
Color.Black;//Màu đen
Color.FromName("Black");//Màu đen

- Lấy màu của 1 pixel:
Color c;
c = bitmap.GetPixel(cot, hang);//cot, hang là tọa độ của pixel cần lấy màu

- Tô màu cho 1 pixel:
 bitmap.SetPixel(cot, hang, Color.FromArgb(r, g, b));//r, g, b là chỉ số RGB

câcsc
3. Thao tác cơ bản:
3.1. Chuyển ảnh về đen trắng (GrayScale):

GrayScale

- Để chuyển một ảnh về đen trắng ta chuyển  chỉ số từng pixel theo công thức: .299 * c.R + .587 * c.G + .114 * c.B

public Bitmap DenTrang(Image anh)
{
    Bitmap kq = new Bitmap(anh.Width, anh.Height);
    Bitmap anhtam = new Bitmap(anh);
    Color c;
    Byte rgb;
    for (int cot = 0; cot < anhtam.Width; cot++)
        for (int hang = 0; hang < anhtam.Height; hang++)
        {
            c = anhtam.GetPixel(cot, hang);
            rgb = (byte)(.299 * c.R + .587 * c.G + .114 * c.B);
            kq.SetPixel(cot, hang, Color.FromArgb(rgb, rgb, rgb));
        }
    return kq;
}


3.2. Chuyển ảnh về âm bản (Invert):

Invert

- Để chuyển ảnh về âm bản ta lấy 255 trừ đi từng chỉ số (làm màu từng pixel ngược lại)



public Bitmap AmBan(Image anh)
{
    Bitmap kq = new Bitmap(anh.Width, anh.Height);
    Bitmap anhtam = new Bitmap(anh);
    Color c;
    for (int cot = 0; cot < anhtam.Width; cot++)
        for (int hang = 0; hang < anhtam.Height; hang++)
        {
            c = anhtam.GetPixel(cot, hang);
            kq.SetPixel(cot, hang, Color.FromArgb(255 - c.R, 255 -  c.G, 255 -  c.B));
        }

    return kq;
}


3.4. Lọc màu (Filter):
Green Filter


- Đề lọc màu (cụ thể là theo 3 màu chính đỏ, xanh lá cây, xanh lam)
+ Màu đỏ: ta giữ nguyên màu đỏ và đảo ngược 2 màu kia (lấy 255 trù đi chỉ số G và B)
+ Tương tự với xanh và xanh lam

public Bitmap ChenMau(Image anh, int mau)
{
    //1 = do; 2 = xanh Green); 3 = xanh (blue)
    Bitmap kq = new Bitmap(anh.Width, anh.Height);
    Bitmap anhtam = new Bitmap(anh);
    Color c;
    int g = 0, r = 0 , b = 0;
    for (int cot = 0; cot < anhtam.Width; cot++)
        for (int hang = 0; hang < anhtam.Height; hang++)
        {
            c = anhtam.GetPixel(cot, hang);
            switch (mau)
            {
                case 1: r = c.R; g = c.G - 255; b = c.B - 255; break;
                case 2: r = c.R - 255; g = c.G; b = c.B - 255; break;
                case 3: r = c.R - 255; g = c.G - 255; b = c.B; break;
            }
            r = Math.Max(r, 0);
            b = Math.Max(b, 0);
            g = Math.Max(g, 0);
            kq.SetPixel(cot, hang, Color.FromArgb(r,g,b));
        }

    return kq;
}



3.5. Ghép 2 hình:
- Đề ghép 2 hình thì ta khai báo một Bitmap có chiều rộng bằng chiều rộng 1 ảnh và chiều cao bằng tổng chiều cao 2 ảnh.
- Sau đó setpixel từng pixel cho bitmap này.
Ngoài ra còn có chỉnh độ sáng (Brightness), chỉnh độ tương phản (Contrast),...các bạn có thể xem thêm
trong code.



4/06/2014
Đăng bởi :
Nhãn :

Code kiểm tra dữ liệu vừa thay đôi trong CSDL


thuvienwinform - Để xem dữ liệu vừa thay đổi (thêm, sửa, xóa) trong CSDL ta sử dụng code sau:
(sử dụng LINQ)
     
        public static bool ChangeData(QLDTDataContext db)
        {
            int insert = db.GetChangeSet().Inserts.Count;
            int update = db.GetChangeSet().Updates.Count;
            int delete = db.GetChangeSet().Deletes.Count;
            if (insert + update + delete == 0)
            {
                return false;
            }
            return true;
        }
Với QLDTDataContext là lớp tạo bởi item LinqToSql: http://thuvienwinform.blogspot.com/2014/03/code-kiem-tra-du-lieu-vua-thay-oi-trong-csdl.html
Kết quả trả vể true nếu có thay đổi và ngược lại
3/15/2014
Đăng bởi :

Hàm set và get trong C#


thuvienwinform - Chắc hẳn trong quá trình học cũng như tìm kiếm trên mạng thì hai hàm này không còn xa lạ đối với các bạn nữa. Nhưng chắc hẳn câu hỏi đầu tiên đặt ra là tại sao lại phải xây dựng các biến theo set và get mà không gán bình thường? Hãy xem nó có những nổi trội gì nhé!

Ví dụ 2 code sử dụng set get:

Code 1:

int _tuoi = 0;
public int Tuoi
{
    set 
    { 
        _tuoi = value;
        if (_tuoi < 0)
            _tuoi = 0;//Không có tuổi nhỏ hơn 0
    }
    get
    {
        return _tuoi;
    }
}    
this.Tuoi = -8;//Thực hiện set => _tuoi = 0;
int layTuoi = this.Tuoi;//thực hiện get => trả về giá trị _tuoi (0)



Code 2:
   
private string _hoTen;
public string HoTen
{
    set { _hoTen = value; }
    get { return _hoTen; }
}
//Tương đương với code sau:
public string HoTen
{
    set;
    get;
}

- Như ở đoạn code 1: khi bạn nhập vào Tuoi = -1 thì nó sẽ trả về 0, chứ bình thường ra phải code một đoạn nữa để xử lí trường hợp nhập sai tuổi! Rất hữu ích đúng không nào
- Còn với đoạn code 2 thì ở đây chỉ nhập vào và xuất ra luôn (chưa có ràng buộc) thì có thể thu gọn về chỉ còn set; get; thôi (vẫn nên sử dụng vì sau này có thêm ràng buôc gì cho biến này thì sẽ thêm vào một cách dễ dàng hơn!).

Có set get mới là thuộc tính, mỗi thuộc tính có các tính chất của nó, ví dụ 0 < Cân nặng < 1000, năm sinh < năm hiện tại, ... set, get để thực hiện các ràng buộc đó.

_tuoi là biến bình thường, còn Tuoi là thuộc tính (có cái cờ lê :v)
3/09/2014
Đăng bởi :
Nhãn :

Breakpoint giúp kiểm soát code, giá trị của các biến trong khi chạy thử

Di chuột để xem các giá trị của mảng hAdress

thuvienwinform - Trong quá trình code và chạy thử thì việc kiểm soát giá trị của các biến là hết sức khó khăn. Thường thì dùng các MessageBox hoặc một textBox, label để hiển thị...Công việc này mất nhiều thời gian. Tại sao không dùng chức năng breakpoint có sẵn trong visual để xem giá trị của chúng! Hôm nay mình xin giới thiệu với các bạn cách sử dụng Breakpoint này (chỉ với 1 click chuột)!

- Tạo Breakpoint
+ Tại đoạn code mà bạn muốn chương trình dừng lại để xem giá trị các biến bạn chuột phải -> Breakpoint -> Insert Breakpoint xong luôn.
+ Mình thường làm như này: tạo 1 button xong Insert Breakpoint vào sự kiện ấn cái button đó. Khi nào muốn dùng lại xem thì ấn button đó là xong! :D

Sau khi Insert Breakpoint xong sẽ có cái hình tròn có mũi tên ở trong xuất hiện tại chỗ mà chương trình sẽ dừng lại

- Xem giá trị các biến như nào?
+ Sau khi chương trình chạy đến đoán có Breakpoint thì chương trình sẽ dừng lại, bây giờ bạn hiển thị Visual Studio lên và di chuột vào biến nào cần xem giá trị là nó sẽ hiện ra cho bạn (Ví dụ như ảnh ở đầu bài này).

Ok vậy là đơn giản trong việc xem giá trị các biến trong khi chạy thử chương trình rồi :)

Cách để thêm nhanh: chuột phải vào biến -> Refactor -> Encapsulate Field... -> ok



3/07/2014
Đăng bởi :
Nhãn : ,

Code up ảnh lên CSDL (Sử dụng kiểu image trong SQL server)



thuvienwinform - Để đưa anh lên CSDL ta phải tạo 1 trường trong bảng với kiểu dữ liệu là image (khi up ảnh lên sẽ chứa trong trường này). Ý tưởng là sẽ convert ảnh cần up lên CSDL thành kiểu memorystream rồi mới up lên. Khi lấy về sẽ dịch ngược lại, từ memorystream thành image!

1. Tạo CSDL



2. Code up ảnh lên CSDL


        //ảnh -> byte[]
        public byte[] imageToByteArray(System.Drawing.Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            return ms.ToArray();
        }
        //byte[] -> ảnh
        public Image byteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

OK! Như vậy là bạn đã có thể up ảnh lên CSDL đc rồi!

Ví dụ sử dụng 2 hàm trên cho 2 nút btChuyenMa và btDichMa (sủ dụng LINQ):
- DB.tbImage: bảng csdl để up ảnh lên, gồm 2 trường là ID và Data


        private void btChuyenMa_Click(object sender, EventArgs e)
        {
            DB.tbImage img = new DB.tbImage();
            img.Data = imageToByteArray(ptbAnh.Image);
            
            db.tbImages.InsertOnSubmit(img);
            db.SubmitChanges();
        }

        private void btDichMa_Click(object sender, EventArgs e)
        {
            var data = (from t in db.tbImages
                        where t.ID == 0
                        select t.Data.ToArray()
                       ).SingleOrDefault();
            b = data;
            ptbLayDL.Image = byteArrayToImage(b);
        }
3/06/2014
Đăng bởi :
Nhãn :

Cách comment (chú thích) cho code

Comment Code giúp dễ dàng sử dụng về sau

thuvienwinform - Khi viết chương trình, phần mềm theo nhóm, khi ta đọc đoạn code của người khác viết sẽ khá khó khăn trong việc sử dụng. Vì vậy để dễ dàng cho làm việc cùng nhau ta cần phải chú thích cho đoạn code của mình vừa đề người khác hiểu, vừa để đễ dàng cho sử dụng sau này cũng như viết tài liệu. Hiểu được vấn đề này, visual studio hỗ trợ việc comment cho code rất tuyệt vời, hôm nay mình xin được giới thiệu nó đến với các bạn!

- Để hiện được chú thích như hình ở đầu bài viết ta làm như sau: Gõ 3 dấu "/" trước hàm, thủ tục mà ta cần chú thích thì nó sẽ tự tạo cho ta 1 sumary để mô tả chức năng của hàm, các param để mô tả chức năng từng biến!



 Ok rất đơn giản phải không nào :)


3/04/2014
Đăng bởi :
Nhãn : ,

Một số hàm hữu ích trong LINQ to SQL



thuvienwinform - LINQ to SQL có rất nhiều hàm, thủ tục hỗ trợ chúng ta trong việc lọc dữ liệu chọn dữ liệu và tất nhiên là nó đã được tối ưu sẵn, cách sử dụng cũng rất đơn giản, dễ ràng trong việc sử dụng, hôm nay mình xin được giới thiệu với mọi người một số hàm, thủ tục chọn dữ liệu

1. Chọn dữ liệu từ 2 bảng:
- Để chọn dữ liệu từ 2 bảng ta sẽ dùng lệnh from như sau:
var canBos = from cb in db.tbCanBos
             from phong in db.tbPhongs
             where (cb.IdPhong == phong.IdPhong) && (phong.TenPhong == "Khoa Ngữ")
             select new { hotenthat = cb.Hoten, quequan = cb.QueQuan, cb.HeSoLuong, phong.TenPhong };


- Chú ý: trong select ta phải dùng new, tức là tạo một bảng mới gồm các thành viện được chọn.

2. Sắp xếp tăng dần theo một trường
- Cách 1: Sắp xếp ngay trong câu lệnh truy vấn:
var canBos = from cb in db.tbCanBos
             from phong in db.tbPhongs
             where (cb.IdPhong == phong.IdPhong) && (phong.TenPhong == "Khoa Ngữ")
             orderby cb.HeSoLuong descending //Sap xep theo hesoluong
             select new { hotenthat = cb.Hoten, quequan = cb.QueQuan, cb.HeSoLuong, phong.TenPhong };

Câu truy vấn này sẽ chọn ra những cán bộ thuộc khoa ngoại ngữ và sắp xếp tăng dần theo hesoluong

- Cách 2: Truy vấn xong mới sắp xếp (cách này hay hơn)
var canBos = from cb in db.tbCanBos
             from phong in db.tbPhongs
             where (cb.IdPhong == phong.IdPhong) && (phong.TenPhong == "Khoa Ngữ")
             select new { hotenthat = cb.Hoten, quequan = cb.QueQuan, cb.HeSoLuong, phong.TenPhong };
canBos = canBos.OrderByDescending(p => p.HeSoLuong);

3. Lấy số dữ liệu nhất định
- Như ví dụ lấy số cán bộ ở trên, ta chỉ cẩn lấy ra 10 đầu tiên trong kết quả thu được thôi, câu lệnh sẽ là:
canBos = canBos.Take(10);
Hoặc
canBos = canBos.Skip(10);
- Với cách dùng Skip() thì ta sẽ bỏ qua 10 người ở đầu danh sách và lấy những người từ vị trí 11 trong danh sách thu được

4. Đếm số dữ liệu thu được sau khi truy vấn
int soNguoi = canBos.Count(10);

<còn tiếp>
1/08/2014
Đăng bởi :

Gợi ý code lấy địa chỉ IP người khác

- Mình không khuyến khích các bạn dùng địa chỉ IP làm việc xấu nhé (vì mình cũng không biết hậu quả của việc biết địa chỉ IP người khác :V)
- Yêu cầu: có 1 database online (đăng kí tại somee.com) xem hướng dẫn tại đây
- Thế này: ta xây thêm vào form 1 cái webrowser (wb) và ẩn nó đi, cho cái wb này chỉ đến địa chỉ  http://whatismyipaddress.com/. Thêm cho wb này sự kiện docmentcomplete là khi load xong trang xem ip kia thì Insert mã nguồn (DocumentText) của wb lên database. Sau đó ta lấy dữ liệu nhận đc từ database có phải là đã có IP của nạn nhân
- Về cái form thì thêm cho nó một số chức năng giải trí như game flash nào đó hoặc một mầu truyện cười (vì trang xem IP khoảng 10s là load xong, Nếu không thì đặt sự kiện FormClose thành Hide là được)
- Chỉ là gợi ý thui, mình không code cụ thể nhé! Và không chịu hậu quả hâu ra :V. Cái này chỉ là kết nối mạng nên không bị diệt virus phát hiện
12/01/2013
Đăng bởi :
Nhãn :

Code lấy thông tin máy tính bằng C# (Tên máy, tài khoản người dùng, phiên bản hệ điều hành, địa chỉ MAC,...)



Code lấy tên máy, phiên bản HĐH, địa chỉ IP, địa chỉ MAC bằng C#

- Demo: https://www.dropbox.com/s/8xw85oo6xg8v86c/ThongTinHeDieuHanh.rar (52KB)
- Để lấy thông tin cơ bản như tên máy, tài khoản đăng nhập vào máy, phiên bản hệ điều hành ta sử đụng lớp Environment sẵn có để lấy những thông tin đó. Ví dụ: Environment.MachineName để lấy tên máy, Environment.UserName để lấy tài khoản đăng nhập vào máy,...

- Để lấy các địa chỉ IP mà máy đang có (Đang kết nối đến bao nhiêu mạng thì có bằng đó IP): http://www.thuvienwinform.tk/2013/10/code-lay-username-va-ip-cua-may.html

- Để lấy địa chỉ MAC ta sử dụng thêm using System.Net.NetworkInfomation;
Code lấy địa chỉ MAC như sau: (cảm ơn anh LNT đã share cho mình code này)

            /////////////////
            //Lấy địa chỉ MAC
            ////////////////  
            string DanhSachMAC = "";
            NetworkInterface[] DanhSachCardMang = NetworkInterface.GetAllNetworkInterfaces();
            for (int i = 0; i < DanhSachCardMang.Length; i++)
            {
                PhysicalAddress DiaChiMAC = DanhSachCardMang[i].GetPhysicalAddress();
                DanhSachMAC += DanhSachCardMang[i].Name + " : ";
                byte[] ByteDiaChi = DiaChiMAC.GetAddressBytes();
                for (int j = 0; j < ByteDiaChi.Length; j++)
                {
                    DanhSachMAC += ByteDiaChi[j].ToString("X2");
                    if (j != ByteDiaChi.Length - 1)
                    {
                        DanhSachMAC += "-";
                    }
                }
                DanhSachMAC += "\r\n";
                txtMAC.Text += DanhSachMAC;
            }

hoặc

            /////////////////
            //Lấy địa chỉ MAC
            ////////////////
            int l, i, j=0;
            string MAC;
            while (true)
            {
                try
                {
                    MAC = NetworkInterface.GetAllNetworkInterfaces()[j].GetPhysicalAddress().ToString(); //đến đây đã lấy được địa chỉ rồi nhưng chưa có dấu phân cách
                    l = MAC.Length - 1;
                    for (i = 0; i <= l; i++)
                    {
                        if (i % 2 == 0 && i != 0) txtMAC.Text += "-";
                        txtMAC.Text += MAC[i];
                    }
                    j++;
                    txtMAC.Text += "\r\n";
                }
                catch
                {
                    break;//Hết địa chỉ MAC rồi thì ngắt vòng lặp
                }
            }
Với cách 2 chạy lâu hơn rất nhiều :) khuyến cáo không nên dùng.

11/20/2013
Đăng bởi :
Nhãn :

Code lấy Username và IP của máy

Form  hiển thị ra user name và các IP của máy

Demo: https://www.dropbox.com/s/z2bavemx6i83812/LayIp-Username-C%23-thuvienwinform.rar (46KB)

Để thực hiện công việc này ta sử dụng thư viện System.Net; (using System.Net;)

Để lấy user name ta dùng code:

string username = Dns.GetHostName();//kiểu string luôn

Để lấy địa chỉ Ip ta dùng code:

IPHostEntry Ip = new IPHostEntry();
Ip = Dns.GetHostByName(HostName);
foreach (IPAddress ip in Ip.AddressList)
{
    txtIp.Text = txtIp.Text + ip.ToString() + "\r\n";
}

Ứng dụng thông tin vào nhiều việc khác nhau ví dụ như tạo biểu mẫu theo dõi phần mềm (đồng bộ qua database), ứng dụng trong mạng LAN,...
Chúc các bạn thành công!
10/26/2013
Đăng bởi :
Nhãn :

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -