Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 37 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
37
Dung lượng
223,6 KB
Nội dung
Chương 2: Lậptrìnhmạng trong windows Chương 2 1. Giớithiệuthư viện winsock -Giaotiếplậptrìnhmạng cho phép phát triển ứng dụng giao tiếp trên cùng một máy hoặc nhiều máy khác nhau thông qua môi trường mạng - Winsock đượchỗ trợ sẵn trong windows cho phép lậptrìnhmạng vớigiao thức TCP/IP hoặcIPX -Lập trình Winsock trong windows ta sử dụng thư viện WINSOCK2.H, WS2_32.LIB - Phiên bản winsock hỗ trợ cho các hệ điều hành Windows như sau: Chương 2 1. Giớithiệuthư viện winsock Khởi động Winsock -Trước khi chạy ứng dụng winsock cần khởi động thư viện winsock, winsock DLL bằng hàm WSAStartup int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); wVersionRequested : version của winsock lpWSAData : trỏ tới struct LPWSADATA Chương 2 1. Giớithiệuthư viện winsock Khởi động Winsock - typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN + 1]; char szSystemStatus[WSASYS_STATUS_LEN + 1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA, * LPWSADATA; Chương 2 1. Giớithiệuthư viện winsock Kết thúc Winsock Gọi hàm int WSACleanup(void); Chương 2 2. Tạo socket trong windows - Cú pháp SOCKET socket ( int af, int type, int protocol ); af: họđịachỉ giao thức, thiếtlậplàAF_INET nếuta sử dụng IPv4 type: kiểu giao thức của socket, thiết lập là SOCK_STREAM cho TCP/IP, SOCK_DGRAM cho UDP/IP Protocol: thiết lập là IPPROTO_TCP đối với TCP, IPPROTO_UDP đối với UDP Chương 2 2. Tạo socket trong windows - Địachỉ winsock quản lý địa chỉ thông qua SOCKADDR_IN structure SOCKADDR_IN structure có dạng sau struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; sin_family : AF_INET sin_addr : lưu trữ địa chỉ IP sin_port : port sin_zero : make the SOCKADDR_IN structure the same size as the SOCKADDR structure. Chương 2 3. Xây dựng chươngtrìnhgiaotiếpcókếtnối dùng winsock socket bind listen accept socket Address resolution connect Server client Chương 2 3. Xây dựng chươngtrìnhgiaotiếpcókếtnối dùng winsock 3.1 Server binding: int bind( SOCKET s, const struct sockaddr FAR* name, int namelen ); Khi socket đượctạoracần dùng hàm bind để bind tới địachỉ s: socket name: kiểu địachỉ socket struct sockaddr namelen: kích thướccủaname Chương 2 3. Xây dựng chươngtrìnhgiaotiếpcókếtnối dùng winsock Đoạnlệnh tạo socket và bind SOCKET s; SOCKADDR_IN tcpaddr; int port = 5150; s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); tcpaddr.sin_family = AF_INET; tcpaddr.sin_port = htons(port); tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(s, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr)); [...]... structure Chương 2 3 Xây dựng chương trình giao tiếp có kết nối dùng winsock Chương trình phía server: #include #pragma comment(lib, "wsock 32. lib") void main(void) { WSADATA wsaData; SOCKET ListeningSocket; SOCKET NewConnection; SOCKADDR_IN ServerAddr; SOCKADDR_IN ClientAddr; int Port = 5150; // Initialize Winsock version 2. 2 WSAStartup(MAKEWORD (2, 2), &wsaData); Chương 2 3 Xây dựng chương trình. .. Winsock version 2. 2 WSAStartup(MAKEWORD (2, 2), &wsaData); // Create a new socket to make a client connection Chương 2 3 Xây dựng chương trình giao tiếp có kết nối dùng winsock 3 .2 Client #include #pragma comment(lib, "wsock 32. lib") void main(void) { WSADATA wsaData; SOCKET s; SOCKADDR_IN ServerAddr; int Port = 5150; // Initialize Winsock version 2. 2 WSAStartup(MAKEWORD (2, 2), &wsaData);... NewConnection Chương 2 3 Xây dựng chương trình giao tiếp có kết nối dùng winsock Chương trình phía server: closesocket(NewConnection); closesocket(ListeningSocket); // When your application is finished handling the connections, // call WSACleanup WSACleanup(); Chương 2 3 Xây dựng chương trình giao tiếp có kết nối dùng winsock 3 .2 Client #include #pragma comment(lib, "wsock 32. lib") void... SendBuf[1 024 ]; int BufLength = 1 024 ; // Initialize Winsock version 2. 2 WSAStartup(MAKEWORD (2, 2), &wsaData); // Create a new socket to receive datagrams on SendingSocket = socket(AF INET, SOCK DGRAM, IPPROTO UDP); Chương 2 5 Xây dựng chương trình giao tiếp không kết nối dùng winsock ReceiverAddr.sin_family = AF_INET; ReceiverAddr.sin_port = htons(Port); ReceiverAddr.sin_addr.s_addr = inet_addr("136.149.3 .29 ");... WSACleanup WSACleanup(); } Chương 2 5 Xây dựng chương trình giao tiếp không kết nối dùng winsock hàm sendto int sendto( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen ); to : trỏ tới địa chỉ cần send tới Chương 2 5 Xây dựng chương trình giao tiếp không kết nối dùng winsock Ví dụ hàm sentto #include #pragma comment(lib, "wsock 32. lib") void main(void)... main(void) { WSADATA wsaData; SOCKET ReceivingSocket; SOCKADDR_IN ReceiverAddr; int Port = 5150; char ReceiveBuf[1 024 ]; int BufLength = 1 024 ; SOCKADDR_IN SenderAddr; int SenderAddrSize = sizeof(SenderAddr); // Initialize Winsock version 2. 2 WSAStartup(MAKEWORD (2 2) &wsaData); Chương 2 5 Xây dựng chương trình giao tiếp không kết nối dùng winsock Ví dụ hàm recvfrom // Create a new socket to receive datagrams... Chương 2 4 Truyền/nhận dữ liệu Hàm WSARecv int WSARecv( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); Chương 2 5 Xây dựng chương trình giao tiếp không kết nối dùng winsock Server client socket socket bind Address resolution recvfrom sendto Chương 2 5 Xây dựng chương. .. call WSACleanup WSACleanup(); } Chương 2 6 Chế độ blocking của socket Nhận xét đoạn chương trình: SOCKET sock; char buff [25 6]; int done = 0, nBytes; while(!done) { nBytes = recv(sock, buff, 65); if (nBytes == SOCKET_ERROR) { printf("recv failed with error %d\n", WSAGetLastError()); Return; } DoComputationOnData(buff); } Chương 2 6 Chế độ blocking của socket Đoạn chương trình trên có trường hợp hàm rev... I/O 4 Truyền/nhận dữ liệu Ví dụ hàm send: char sendbuff [20 48]; int nBytes = 20 48, nLeft, idx; // Fill sendbuff with 20 48 bytes of data // Assume s is a valid, connected stream socket nLeft = nBytes; idx = 0; while (nLeft > 0) { ret = send(s, &sendbuff[idx], nLeft, 0); if (ret == SOCKET_ERROR) { // Error } nLeft -= ret; idx += ret; } Chương 2 Chương 2 4 Truyền/nhận dữ liệu Hàm recv and WSARecv int recv(.. .Chương 2 3 Xây dựng chương trình giao tiếp có kết nối dùng winsock Listenning: lắng nghe kết nối từ client int listen( SOCKET s, int backlog ); backlog : chiều dài tối đa của hàng đợi kết nối Chương 2 3 Xây dựng chương trình giao tiếp có kết nối dùng winsock accepting: chấp nhận kết nối SOCKET accept( SOCKET . môi trường mạng - Winsock đượchỗ trợ sẵn trong windows cho phép lậptrìnhmạng vớigiao thức TCP/IP hoặcIPX -Lập trình Winsock trong windows ta sử dụng thư viện WINSOCK2.H, WS2_ 32. LIB - Phiên bản. Chương 2: Lậptrìnhmạng trong windows Chương 2 1. Giớithiệuthư viện winsock -Giaotiếplậptrìnhmạng cho phép phát triển ứng dụng giao tiếp trên cùng một. = 5150; // Initialize Winsock version 2. 2 WSAStartup(MAKEWORD (2, 2), &wsaData); Chương 2 3. Xây dựng chươngtrìnhgiaotiếpcókếtnối dùng winsock Chương trình phía server: // Create a new socket