MỘT SỐ HÀM THÔNG DỤNG CỦA SOCKET

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

MỘT SỐ HÀM THÔNG DỤNG CỦA SOCKET

Bài gửi  tranngochuy(I22B) on 29/3/2013, 15:57

MỘT SỐ HÀM THÔNG DỤNG CỦA SOCKET
Hàm tạo socket :
SOCKET socket( int af, int type, int protocol);
af : domain . Có thể lấy các giá trị sau : AF_INET , AF_UNIX , AF_IPX , AF_ISO , AF_NS ...
type : SOCK_STREAM , SOCK_DGRAM
protocol : lấy giá trị 0 để sử protocol mặc định cho mỗi loại socket
Giá trị trả về là sokcet discriptor , là một con số dùng để mô tả socket mình vừa tạo ra .

Hàm đóng socket :
closesocket(SOCKET sk ) ;

Hàm bind
int bind(SOCKET s, const struct sockaddr* name, int namelen);
Trước khi gọi hàm bind bạn phải tạo một socket trước bằng hàm socket() . Sau khi tạo socket là tới lúc mình sẽ dùng hàm bind gán cho nó các thông tin như port và địa chỉ
Thông tin này đựơc lưu trữ trong struct sockaddr* name

Hàm listen
int listen( SOCKET s, int backlog);
Hàm này dùng để tạo hàng đợi các kết nối . backlog là số kết nối tối đa trong hàng đợi . Do một server thì một lúc có thể có nhiều kết nối tới do đó cần phải có một hàng đợi để lưu trữ các kết nối này . Socket s sẽ đóng vai trò lắng nghe các kết nối và đưa nó vào hàng đợi

Hàm accept
SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen);
Cách hoạt động của hàm accept là như sau:
Khi ta gọi hàm accept nó sẽ đưa thread mà hàm accept đang hoạt động vào trạng thái blocking . Khi có một kết nối ở trong hàng đợi thì hàm accept sẽ kết thúc và thread sẽ thoát khỏi trạng thái blocking . Khi này hàm accept đã tạo ra một socket mới ( thông tin về socket này chúng ta không thể biết ) và đặt các địa chỉ của client vào struct sockaddr* addr . Socket mới này chính là kết quả trả về của hàm accept . Ta sẽ dùng socket mới này để liên lạc với client chứ không dùng socket cũ là s .

Hàm select
int select( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout);
Đây là một hàm quan trọng . Hàm này dùng để thay đổi trạng thái của socket từ blocking sang non-blocking và ngược lại . Bình thường thì các socket được tạo ra từ các hàm trên sẽ tạo ra một socket dạng blocking , tức là nó sẽ đưa thread vào trạng thái blocking khi chưa có dữ liệu hoặc chưa có kết nối . Ta có thể dùng hàm select để thay đổi các trạng thái đó ,
Hàm select sẽ trả về nếu như có một socket nào đó trong danh sách các socket readfds và writefds phát sinh tín hiệu là sẵn sàng hoạt động. Nếu như chưa có tín hiệu nào thì hàm listen sẽ đưa thread vào trạng thái ngủ ( hổng có gì làm thì ngủ là khỏe nhất ) Ta có thể lợi dụng điều này để có thể viết chương trình mà không cần phải tạo nhiều thread để quản lý từng kết nối
Các macro phụ trợ cho hàm select là
FD_CLR(s, *set)
Removes the descriptor s from set.
FD_ISSET(s, *set)
Nonzero if s is a member of the set. Otherwise, zero.
FD_SET(s, *set)
Adds descriptor s to set.
FD_ZERO(*set)
Initializes the set to the null set.

*set ứng với các biến thuộc kiểu fd_set*

typedef struct
fd_set {
u_int fd_count;
SOCKET fd_array[FD_SETSIZE];
} fd_set;

tranngochuy(I22B)

Tổng số bài gửi : 15
Join date : 25/03/2013
Age : 27
Đến từ : 12H1010050

Xem lý lịch thành viên

Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết