10. Spi_Ethernet_putString
4.2.2 Các hàm API dùng cho PC Khái niệm về socket:
Khái niệm về socket:
Trong mô hình mạng, hai máy tính có thể trao đổi thông tin cho nhau thì cần phải tạo ra kết nối giữa chúng. Vì vậy người ta xây dựng khái niệm socket, nhằm đơn giản hoá quá trình thiết lập kết nối và trao đổi dữ liệu. Socket dựa trên giao thức TCP/IP tạo môi trường trung gian cho các ứng dụng và giao thức bên dưới. Socket được xem là một cấu trúc dữ liệu trừu tượng dùng để tạo ra một kênh truyền để gửi và nhận dữ liệu giữa các process trong cùng chương trình hay giữa các máy trong cùng môi trường mạng với nhau.
Quá trình truyền, nhận dữ liệu cần có một bên đóng vai trò server còn bên kia đóng vai trò client. Đối với TCP thì đầu tiên server phải tạo ra một socket và chờ đợi các yêu cầu kết nối từ client. Client tạo ra socket cho riêng nó xác định vị trí server(dựa vào tên của server hay địa chỉ của server trong mạng) và tiến hành việc kết nối với server, sau khi kết nối được thiết lập thì client và server có thể tiến hành trao đổi dữ liệu với nhau.
Tóm lại, socket là đầu trao đổi dữ liệu giữa các quá trình, qua đó các ứng dụng Winsock gửi và nhận dữ liệu qua mạng.
Một TCP/IP socket gồm một địa chỉ IP kết hợp với một port xác định duy nhất một quá trình liên mạng. Đối với giao thức IP, mỗi bên giao tiếp được gán một địa chỉ IP đại diện bởi một chuỗi 32 bit, gọi là địa chỉ Ipv4. Ngoài địa chỉ IP để truy cập máy tính ở xa, một ứng dụng phải biết được số cổng hay port của dịch vụ để truyền thông với dịch vụ đang chạy trên máy cục bộ hoặc ở xa.
Khi một client muốn truyền thông giao tiếp với server qua giao thức TCP hay UDP, nó phải dò địa chỉ IP của server song song với số cổng dịch vụ. Khi server muốn lắng nghe kết nối và thu thập nhu cầu của client chúng phải chỉ rõ một địa chỉ IP và port.
Có hai loại socket:
Stream socket: dựa trên giao thức TCP, việc truyền dữ liệu chỉ thực hiện giữa hai quá trình đã thiết lập kết nối. Dữ liệu được truyền tin cậy, đúng trình tự và không lặp lại.
Datagram socket: Dựa trên giao thức UDP, việc truyền dữ liệu không yêu cầu có sự thiết lập kết nối giữa hai quá trình. Dữ liệu truyền không tin cậy, có thể không đúng trình tự hoặc lặp lại.
1.Hàm WSAStartup khởi động Windows Sockets.
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
Hàm trả về 0 nếu thành công
wVersionRequested: Version yêu cầu của Windows Sockets. lpWSAData: Nhận lại các thông tin chi tiết của Windows Sockets. 2.Hàm WSACleanup kết thúc Windows Sockets.
int WSACleanup(void);
Hàm trả về giá trị 0 nếu thành công. 3. Hàm socket tạo một socket.
SOCKET socket (int af, int type, int protocol);
af: họ địa chỉ
type: kiểu của socket 4. Hàm close kết thúc một socket
int closesocket (SOCKET s ); Hàm trả về 0 nếu thành công
5.Hàm accept hàm chấp nhận yêu cầu kết nối từ client
SOCKET accept(SOCKET s, structsockaddr FAR * addr, int FAR *addrlen); Hàm trả về INVALID_SOCKET nếu không thành công
s: Socket đang ở trạng thái listen. Kết nối được tạo ra với socket trả về. addr: chứa địa chỉ của nơi kết nối
addrlen: độ dài của dữ liệu trong addr 6.Hàm connect yêu cầu thiếp lập một kết nối
int connect (SOCKET s, const structsockaddr *name, int namelen);
s : Một socket chưa kết nối name: tên của socket cần kết nối namelen: chiều dài của đối số name 7.Hàm send gửidữ liệu
int send (SOCKET s, const char *buf, int len, int flags ); Hàm trả về số byte đã truyền
s: Socket kết nối
buf: vùng chứa dữ liệu truyền len: độ dài dữ liệu cần truyền 8.Hàm recv nhận dữ liệu
int recv (SOCKET s, char *buf, int len, int flags );
Hàm trả về số byte nhận được, SOCKET_ERROR chỉ định có lỗi, 0 nếu kết nối kết thúc
s: socket kết nối buf: vùng đệm nhận len: độ lớn của vùng đệm flag: đặt là 0
int bind(SOCKET s, const struct sockaddr *addr, int namelen ); Hàm trả về giá trị 0 nếu thành công
s : socket chưa được sử dụng addr: địa chỉ gán cho socket namelen: độ dài lớn của addr
10.Hàm setsockopt đặt một số thuộc tính cho socket
int setsockopt (SOCKET s, int level, int optname, constchar *optval, int optlen
);
Hàm trả về giá trị 0 nếu thành công s: socket cần thay đổi
level: cấp của tuỳ chọn , có thể ở mức socket, giao thức TCP/UDP, hoặc ở giao thức IP
optname: thuộc tính cần thay đổi
optval: con trỏ đến vùng đệm chứa giá trị cần đặt optlen: độ dài của vùng optval