Các thao tác cơ bản trong lập trình socket trên windows

13 417 0
Các thao tác cơ bản trong lập trình socket trên windows

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

Ngày đăng: 04/12/2015, 20:24

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan