Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT BÀI THỰC HÀNH SỐ Các thao tác lập trình socket windows Yêu cầu thực hành: Viết chương trình thực hành lệnh thực hành Tham khảo chương trình mẫu kèm theo thực hành Cơ chế gọi hàm lập trình socket 1.1 TCP Hình Lập trình socket sử dụng TCP 1.2 UDP - Với giao thức UDP, không cần phải thiết lập kết nối trước truyền nhận liệu Chương trình server không sử dụng hai hàm listen() accept() Chương trình client không cần sử dụng hàm connect() - Sử dụng hàm sendto() thay cho hàm send() TCP - Sử dụng hàm recvfrom() thay cho recv() TCP Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT - Client sử dụng hàm connect() để gắn kết cục địa máy tính xa với socket cục sau sử dụng hai hàm send() receive() để truyền, nhận liệu; nhiên kết nối thiết lập Thư viện lập trình Winsock 2.1 Khởi động đóng thư viện 2.1.1 Khởi động Winsock - Khởi động thư viện Winsock trước thực thao tác khác int WSAStartup(WORD wVersionRequested, LPWSADATA lp WSAData); * Các tham số wVersionRequested: [in] phiên thư viện Winsock cần phải khởi động Giá trị gồm byte: byte thấp số phiên chính, byte cao số phiên phụ Giá trị định rõ (0x0202) dùng macro MAKEWORD(2,2) lpWSAData: [out] thông tin thư viện Winsock khởi động, có chứa phiên Winsock typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; // bỏ qua unsigned short iMaxUdpDg; char FAR * lpVendorInfo; // bỏ qua // bỏ qua } WSADATA, *LPWSADATA; wVersion Phiên Winsock cần khởi động Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT wHighVersion Phiên Winsock khởi động szDescription Chủ đề thư viện khởi động szSystemStatus Trạng thái hay thông tin cấu hình * Giá trị trả 0, thành công khác 0, có lỗi Hàm WSAGetLastError() dùng để xác định lỗi 2.1.2 Đóng thư viện Winsock - Đóng thư viện Winsock giải phóng tài nguyên int WSACleanup(void) 2.2 Window socket 2.2.1 Tạo socket SOCKET socket ( int af, int type, int protocol ) * Các tham số af: [in] mô tả họ địa type: [in] kiểu socket o SOCK_STREAM: TCP socket o SOCK_DGRAM: UDP socket protocol: [in] nghi thức sử dụng socket Nghi thức Họ tầng địa IP Kiểu socket Nghi thức sử dụng socket AF_INET TCP SOCK_STREAM IPPROTO_IP UDP SOCK_DGRAM IPPROTO_UDP Raw SOCK_RAW IPPROTO_RAW Socket IPPROTO_ICMP * Giá trị trả socket (SOCKET), thành công Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT INVALID_SOCKET, có lỗi 2.2.2 Kiểm tra xử lý lỗi - Giá trị lỗi trả lời gọi hàm Winsock không thành công thường SOCKET_ERROR (-1) Để lấy chi tiết mã lỗi, sử dụng hàm: int WSAGetLastError (void) * Giá trị trả Các số lỗi WSAE định nghĩa tập tin Winsock.h Winsock2.h 2.2.3 Internet Address - Sử dụng cấu trúc SOCKADDR_IN để định thông tin địa IP cổng dịch vụ typedef struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; } SOCKADDR_IN; sin_family: họ địa chỉ, phải thiết lập AF_INET sin_port: cổng dịch vụ sin_addr: địa IP định theo cấu trúc sau: typedef struct in_addr { union { struct{ unsigned char s_b1, s_b2, s_b4; } S_un_b; struct { unsigned short s_w1, s_w2; Lab Lập trình Socket – TCP & UDP s_b3, Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT } S_un_w; unsigned long s_addr; } S_un; } SOCKADDR; sin_zero: byte thêm vào để tạo cấu trúc có cùn kích thước với SOCKADDR - Địa INADDR_ANY định server “lắng nghe” yêu cầu từ client tất card mạng - Địa INADDR_BROADCAST dùng để gửi gói tin UDP broadcast Để sử dụng giá trị này, socket phải thiết lập tùy chọn SO_BROADCAST 2.2.3.1 Chuyển đổi địa IP từ chuỗi sang số - Chuyển đổi chuỗi biểu diễn địa IP sang số nguyên 32 bit unsigned long inet_addr(const char FAR *cp) * Các tham số cp: [in] chuỗi biểu diễn địa IP * Giá trị trả số nguyên (unsigned long) biểu diễn địa IP theo thứ tự network-byte INADDR_NONE, có lỗi 2.2.3.1 Chuyển đổi địa IP từ số sang chuỗi - Chuyển đổi địa IP số sang chuỗi biểu diễn địa IP Sau chuyển đổi địa xong nên chép giá trị trả sang vùng nhớ khác để tránh liệu gọi thực hàm Winsock khác char FAR * inet_ntoa ( struct in_addr in ) * Các tham số in: [in] cấu trúc biểu diễn địa Internet máy tính * Giá trị trả Chuỗi biểu diễn địa IP, thành công Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT NULL, không thành công 2.2.4 Thứ tự byte - Thứ tự host-byte - little-endian form: từ byte thấp đến byte cao - Thứ tự network-byte - big-endian form: từ byte cao đến byte thấp 2.2.4.1 Chuyển đổi từ thứ tự host-byte sang thứ tự network-byte u_long htonl(u_long hostlong) u_short htons(u_short hostshort) 2.2.4.2 Chuyển đổi từ thứ tự network-byte sang thứ tự host-byte u_long ntohl(u_long hostlong) u_short ntohs(u_short hostshort) 2.2.5 Phân giải tên - Cấu trúc liệu biểu diễn thông tin máy tính typedef struct hostent { char FAR * h_name; char FAR * FAR * h_aliases; short h_addrtype; short h_length; char FAR * FAR * h_addr_list; } HOSTENT, *LPHOSTENT; h_name: tên máy tính h_aliases: mảng tên khác máy tính h_addrtype: kiểu địa trả h_length: chiều dài địa chỉ, tính byte h_addr_list: danh sách địa máy tính theo thứ tự networkbyte Macro h_addr định nghĩa h_addr_list[0] để tương thích với ứng dụng cũ 2.2.5.1 Lấy thông tin biết tên - Nhận thông tin máy tính tương ứng với tên cho trước Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT struct HOSTENT FAR* gethostbyname( const char FAR * name ) * Các tham số name: [in] tên máy tính cần phân giải * Giá trị trả Một cấu trúc HOSTENT, thành công NULL, có lỗi 2.2.5.2 Lấy thông tin biết địa IP - Nhận thông tin máy tính tương ứng với địa IP cho trước struct HOSTENT FAR * gethostbyaddr( const char FAR * addr, int len, int type ) * Các tham số addr: [in] địa máy tính theo thứ tự network-byte len: [in] chiều dài chuỗi địa type: [in] kiểu địa chỉ, thiết lập AF_INET * Giá trị trả Một cấu trúc HOSTENT, thành công NULL, có lỗi 2.2.6 Thông tin dịch vụ - Thông tin dịch vụ mô tả \WINNT\system32\drivers\etc\services - Cấu trúc SERVENT dùng để mô tả thông tin dịch vụ struct servent { char FAR * s_name; char FAR * FAR * s_aliases; short s_port; char FAR * s_proto; Lab Lập trình Socket – TCP & UDP tập tin Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT }; s_name: tên dịch vụ s_aliases: tên khác s_port: số hiệu cổng dịch vụ, theo thứ tự network-byte s_proto: tên giao thức sử dụng cho dịch vụ - Để lấy thông tin dịch vụ, sử dụng hàm: struct servent FAR * getservbyname ( const char FAR *name, const char FAR *proto ) * Các tham số name: [in] tên dịch vụ proto: [in] tên giao thức sử dụng Giá trị NULL định xét tên dịch vụ * Giá trị trả Một cấu trúc SERVENT, thành công NULL, có lỗi 2.3 TCP 2.3.1 Gắn địa cho socket int bind( SOCKET s, const struct sockaddr FAR* name, int namelen ) * Các tham số s: [in] socket chưa gắn kết địa name: [in] địa gán cho socket, cấu trúc SOCKADDR namelen: [in] kích thước giá trị tham số name * Giá trị trả 0, thành công SOCKET_ERROR, có lỗi 2.3.2 Lắng nghe kết nối Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT int listen( SOCKET s, int backlog ) * Các tham số s: [in] socket gắn địa chưa kết nối backlog: [in] kích thước tối đa hàng đợi thiết lập kết nối Giá trị tối đa định số SOMAXCONN 2.3.3 Chấp nhật thiết lập kết nối SOCKET accept( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen ) * Các tham số s: [in] socket lắng nghe yêu cầu kết nối addr: [out] địa socket máy client thực kết nối addrlen: [out] chiều dài thực addr Phải khởi tạo giá trị ban đầu kích thước addr * Giá trị trả Một SOCKET để giao tiếp thực với client, thành công INVALID_SOCKET, có lỗi 2.3.4 Thiết lập kết nối int connect( SOCKET s, const struct sockaddr FAR* name, int namelen ) * Các tham số s: [in] socket chưa kết nối name: [in] socket cần kết nối đến namelen: [in] kích thước name * Giá trị trả 0, thành công SOCKET_ERROR, có lỗi 2.3.5 Gửi liệu Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT int send( SOCKET s, const char FAR * buf, int len, int flags ) * Các tham số s: [in] socket kết nối buf: [in] vùng đệm chứa liệu cần gửi len: [in] chiều dài liệu buf flags: [in] định cách thức truyền liệu, truyền liệu bình thường, thiết lập giá trị * Giá trị trả số byte gửi đi, thành công SOCKET_ERROR, có lỗi 2.3.6 Nhận liệu int recv( SOCKET s, char FAR* buf, int len, int flags ) * Các tham số s: [in] socket kết nối buf: [out] vùng đệm để lưu liệu nhận len: [in] kích thước vùng đệm buf flags: [in] định cách thức nhận liệu, nhận liệu bình thường, thiết lập giá trị * Giá trị trả số byte liệu nhận được, thành công SOCKET_ERROR, có lỗi 2.3.7 Shutdown int shutdown( SOCKET s, int how ) * Các tham số s: [in] socket cần shutdown Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT how: [in] định loại thao tác không thực o SD_RECEIVE: không cho phép gọi hàm recv() socket o SD_SEND: không cho phép gọi hàm send() socket o SD_BOTH: không cho phép gọi send() recv() socket * Giá trị trả 0, thành công SOCKET_ERROR, có lỗi 2.3.8 Đóng socket int closesocket (SOCKET s) * Các tham số s: [in] socket cần đóng 2.4 UDP 2.4.1 Nhận liệu int revcfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ) *Các tham số Bốn tham số giống mô tả hàm recv() from: [out] thông tin địa máy tính gửi liệu fromlen: [in/out] kích thước cấu trúc from * Giá trị trả số byte thực nhận được, thành công 0, socket đóng cách SOCKET_ERROR, có lỗi 2.4.2 Gửi liệu Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT int sendto( SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen ) *Các tham số buf: [in] liệu cần gửi len: [in] kích thước liệu cần gửi, tính byte to: [in] địa máy đích nhận liệu tolen: [in] kích thước cấu trúc to Các tham số khác giống mô tả hàm recvfrom() * Giá trị trả số byte thực gửi, thành công SOCKET_ERROR, có lỗi 2.5 Các hàm tiện ích khác 2.5.1 Lấy tên máy tính cục int gethostname ( char *name, int namelen ) * Các tham số name: [out] vùng đệm để lưu tên máy tính cục namelen: [in] kích thước vùng đệm 2.5.2 Lấy thông tin máy tính xa int getpeername ( SOCKET s, struct sockaddr *name, int *namelen ) * Các tham số s: [in] socket kết nối name: [out] cấu trúc liệu để nhận thông tin socket máy tính xa namelen: [in/out] kích thước cấu trúc name 2.5.3 Lấy thông tin socket cục Lab Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính Truyền Thông – Trường Đại Học CNTT int getsockname ( SOCKET s, struct sockaddr *name, int *namelen ) * Các tham số s: [in] socket cần lấy tên name: [out] thông tin socket namelen: [in/out] kích thước vùng đệm name * Ghi : Nếu hệ thống thư viện Winsock2, cần sử dụng thư viện wsock32.lib + VC++ : chọn Project – Add to Project – File , chọn File of type : dạng file lib chọn đường dẫn đến tập tin …\ VC98\Lib\WS2_32.lib + net 2003 , 2005 : chọn Properties – Configuration Properties – Linker – Command Line nhập WS2_32.lib vào ô Additional option Lab Lập trình Socket – TCP & UDP [...]... how: [in] chỉ định những loại thao tác nào không thực hiện nữa o SD_RECEIVE: không cho phép gọi các hàm recv() trên socket o SD_SEND: không cho phép gọi các hàm send() trên socket o SD_BOTH: không cho phép gọi cả send() và recv() trên socket * Giá trị trả về 0, nếu thành công SOCKET_ ERROR, nếu có lỗi 2.3.8 Đóng socket int closesocket (SOCKET s) * Các tham số s: [in] socket cần đóng 2.4 UDP 2.4.1... vùng đệm 2.5.2 Lấy thông tin của máy tính ở xa int getpeername ( SOCKET s, struct sockaddr *name, int *namelen ) * Các tham số s: [in] socket đã được kết nối name: [out] cấu trúc dữ liệu để nhận thông tin socket của máy tính ở xa namelen: [in/out] kích thước của cấu trúc name 2.5.3 Lấy thông tin của socket cục bộ Lab 4 Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software... liệu int revcfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ) *Các tham số Bốn tham số đầu tiên giống như mô tả trong hàm recv() from: [out] thông tin địa chỉ của máy tính gửi dữ liệu fromlen: [in/out] kích thước của cấu trúc from * Giá trị trả về số byte thực sự nhận được, nếu thành công 0, nếu socket đã được đóng đúng cách SOCKET_ ERROR, nếu... địa chỉ của máy đích nhận dữ liệu tolen: [in] kích thước của cấu trúc to Các tham số khác giống như mô tả trong hàm recvfrom() * Giá trị trả về số byte thực sự được gửi, nếu thành công SOCKET_ ERROR, nếu có lỗi 2.5 Các hàm tiện ích khác 2.5.1 Lấy tên của máy tính cục bộ int gethostname ( char *name, int namelen ) * Các tham số name: [out] vùng đệm để lưu tên của máy tính cục bộ namelen:... cách SOCKET_ ERROR, nếu có lỗi 2.4.2 Gửi dữ liệu Lab 4 Lập trình Socket – TCP & UDP Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính và Truyền Thông – Trường Đại Học CNTT int sendto( SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen ) *Các tham số buf: [in] dữ liệu cần gửi len: [in] kích... © Foxit Software http://www.foxitsoftware.com For evaluation only Khoa Mạng Máy Tính và Truyền Thông – Trường Đại Học CNTT int getsockname ( SOCKET s, struct sockaddr *name, int *namelen ) * Các tham số s: [in] socket cần lấy tên name: [out] thông tin của socket namelen: [in/out] kích thước của vùng đệm name * Ghi chú : Nếu hệ thống không có thư viện Winsock2, cần sử dụng thư viện wsock32.lib... lib chọn đường dẫn đến tập tin …\ VC98\Lib\WS2_32.lib + đối với net 2003 , 2005 : chọn Properties – Configuration Properties – Linker – Command Line nhập WS2_32.lib vào ô Additional option Lab 4 Lập trình Socket – TCP & UDP ... Window socket 2.2.1 Tạo socket SOCKET socket ( int af, int type, int protocol ) * Các tham số af: [in] mô tả họ địa type: [in] kiểu socket o SOCK_STREAM: TCP socket o SOCK_DGRAM: UDP socket. .. trị trả 0, thành công SOCKET_ ERROR, có lỗi 2.3.8 Đóng socket int closesocket (SOCKET s) * Các tham số s: [in] socket cần đóng 2.4 UDP 2.4.1 Nhận liệu int revcfrom ( SOCKET s, char FAR* buf,... s: [in] socket chưa kết nối name: [in] socket cần kết nối đến namelen: [in] kích thước name * Giá trị trả 0, thành công SOCKET_ ERROR, có lỗi 2.3.5 Gửi liệu Lab Lập trình Socket – TCP