1 Chi Tiết Các Phương Pháp Winsock
1.1.4 Làm việc với Socket trong Winsock
• Khởi tạo Socket :
Hàm int socket (int domain, int type, int protocol) được gọi để khởi tạo Socket trong miền và kiểu xác định. Nếu giao thức không được chỉ rõ hệ thống sẽ mặc
định giao thức hỗ trợ loại socket chỉ định. Các socket nắm giữ sẽ được trả về. Quá trình truyền thông kết nối qua các địa chỉ. Hàm int bind (int s, const struct sockaddr *name, int namelen) được gọi để kết hợp đường dẫn hoặc địa chỉ Internet tới Socket. Sử dụng unlink () rm() để hủy một socket.
• Kết nối các Stream Socket:
Đối với việc kết nối các Socket, một tiến trình thường hoạt động như Server mà tiến trình khác là Client. Server kết hợp Socket của nó tới đường dẫn hoặc địa chỉ. Sau đó Server giọ hàm int listen (int s, int backlog) cho SOCK_STREAM. Nó xác định có bao nhiêu yêu cầu kết nối trong hàng đợi .Một Client khởi tạo kết nối tới Socket của Server bằng cách gọi hàm int connect (int s, struct sockaddr *name, int namelen) Server gọi hàm accept() để hoàn tất kết nối cho SOCK_STREAM. Hàm int accept (int s, struct sockaddr *addr, int *addrlen) trả về một socket mới phù hợp với sự liên lạc riêng đó. Môt server có thể có nhiều kết nối SOCK_STREAM chủ động trong cùng lúc.
• Truyền tải và đóng Stream Socket:
Có một số hàm để gửi và nhận dữ liệu từ Socket SOCK_STREAM đó là read()
và write(). Các hàm send (int s, const char *msg, int len, int flags) , revc (int s, const chả *buf, int len, int flags) giống với read() và write() nhưng có thêm một số cờ điều khiển:Dùng hàm close() để đóng Socket.
• Datagram Socket:
Một Datagram Socket không đòi hỏi phải thành lập kết nối. Mỗi thông điệp sẽ mang một địa chỉ đích. Nếu địa chỉ cục bộ riêng biệt là cần thiết thì việc gọi hàm
bind() phải được gọi trước khi truyền dữ liệu. Dữ liệu được gửi thông qua hàm
sendto() hoặc sendmsg(). Hàm sendto được gọi giống như hàm send() được gọi với địa chỉ đích xác định. Để nhận các thông báo Datagram Socket ta gọi hàm
recvfrom() hoặc recvmsg(). Trong khi revc() yêu cầu một vùng đệm thì
recvfrom() yêu cầu tới 2 vùng đệm cho dữ liệu và cho địa chỉ nguồn. Datagram Socket cũng có thể dùng hàm connect() để kết nối socket tới một socket đích được xác định trước. Khi công việc hoàn tất thì hàm send() và recv() được dùng
để gửi và nhận dữ liệu. Hàm accept() và listend() không được sử dụng với Datagram Socket.
1.2 .NET Socket
1.2.1 Khái niệm
.NET Socket tương tự như Winsock là một thư viện lập trình socket cho window nhưng hoạt động trên nền .NET. Nói cách khác, .NET Socket là một giao diện lập trình “managed code” của Window Socket (Winsock), tức là nó hoạt động trên nền Winsock. Do vậy, ta hầu như có thể coi lập trình với .NET Socket giống như lập trình với Winsock. Trong .NET Socket, chúng ta có 3 loại Socket tương tự như Winsock là Stream Socket, Datagram Socket và Raw Socket. Hầu hết các lớp dùng để lập trình với .NET Socket nằm trong Namespace System.Net.Sockets.
Sơ đồ giao tiếp thông qua .NET Socket