Bài giảng Lập trình mạng: Bài 4 - Bùi Trọng Tùng
Số trang: 20
Loại file: pdf
Dung lượng: 214.05 KB
Lượt xem: 13
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài giảng "Lập trình mạng - Bài 4: Lập trình WinSock nâng cao" cung cấp cho người học các kiến thức: Xây dựng ứng dụng yêu cầu lớn (Scalable Apps), sử dụng raw socket, xây dựng ứng dụng broadcast và multicast. Mời các bạn cùng tham khảo.
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình mạng: Bài 4 - Bùi Trọng TùngBÀI 4.LẬP TRÌNH WINSOCK NÂNG CAO1Nội dung• Xây dựng ứng dụng yêu cầu lớn (Scalable Apps)• Sử dụng raw socket• Xây dựng ứng dụng broadcast và multicast211. XÂY DỰNG ỨNG DỤNG YÊU CẦU LỚN3Ứng dụng yêu cầu lớn(Scalable Apps)• Ứng dụng cần xử lý số lượng kết nối, yêu cầu rất lớn• Sử dụng các hàm WinSock API hiệu năng cao• AcceptEx()• ConnectEx()• TransmitFile()• TransmitPacket()• …• Sử dụng kỹ thuật vào ra Overlapped I/O với CompletionPort• Cần có các kỹ thuật kiểm soát số lượng kết nối, quản lýtài nguyên42Hàm AcceptEx()• Chấp nhận một kết nối và (có thể) nhận gói tin đầu tiên• Bộ đệm chứa dữ liệu nhận được và thông tin địa chỉ• sAcceptSocket phải ở trạng thái chưa kết nối• Trả về TRUE nếu thành côngBOOL AcceptEx(SOCKET sListenSocket,//[IN] Socket nghe yêu cầuSOCKET sAcceptSocket,//[IN] Socket chấp nhận kết nốiPVOID lpOutputBuffer,//[IN] Bộ đệm nhận dữ liệuDWORD dwReceiveDataLength, //[IN] Kích thước bộ đệmDWORD dwLocalAddressLength,//[IN] Kích thước phần bộ đệm// chứa địa chỉ local socketDWORD dwRemoteAddressLength, //[IN] Kích thước phần bộ đệm// chứa địa chỉ remote socketLPDWORD lpdwBytesReceived,//[OUT] Kích thước dữ// liệu đã nhậnLPOVERLAPPED lpOverlapped//[IN] Kết quả vào ra);5Sử dụng AcceptEx()SOCKET listenSock, accSock;HANDLE hCompPort;LPFN_ACCEPTEX lpfnAcceptEx=NULL;GUID GuidAcceptEx=WSAID_ACCEPTEX;PER_IO_DATAol;SOCKADDR_IN saLocal;DWORD dwBytes;char buf[1024];int buflen=1024;// Create the completion porthCompPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL, (ULONG_PTR)0, 0);// Create the listening socketlistenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// Associate listening socket to completion portCreateIoCompletionPort((HANDLE) listenSock, hCompPort,(ULONG_PTR)0, 0);63Sử dụng AcceptEx()// Bind the socket to the local portsalocal.sin_family = AF_INET;salocal.sin_port= htons(5150);salocal.sin_addr.s_addr = htonl(INADDR_ANY);bind(listenSock, (SOCKADDR *)&saLocal, sizeof(salocal));// Set the socket to listeninglisten(listenSock, 200);// Load the AcceptEx functionWSAIoctl(listenSock,SIO_GET_EXTENSION_FUNCTION_POINTER,GuidAcceptEx,sizeof(GuidAcceptEx),&lpfnAcceptEx,sizeof(lpfnAcceptEx),&dwBytes, NULL, NULL);Gọi hàmAcceptEx() khichạy hiệu năngtốt hơn7Sử dụng AcceptEx()// Create the client socket for the accepted connectionaccSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// Initialize our extended overlapped structurememset(&ol, 0, sizeof(ol));ol.operation = OP_ACCEPTEX;ol.client= accSock;lpfnAcceptEx(listenSock, accSock, buf,buflen - ((sizeof(SOCKADDR_IN) + 16) * 2),sizeof(SOCKADDR_IN) + 16,sizeof(SOCKADDR_IN) + 16,&dwBytes, &ol.overlapped);// Call GetQueuedCompletionStatus within the completion//function After the AcceptEx() operation completes associate//the accepted client socket with the completion port84Hàm GetAcceptExSockaddrs()• Lấy thông tin địa chỉ từ dữ liệu của hàm AcceptEx()void GetAcceptExSockaddrs(PVOID lpOutputBuffer,//[IN] Bộ đệm nhận dữ liệu// sử dụng trong AcceptEx()DWORD dwReceiveDataLength, //[IN] Kích thước dữ liệu trong// bộ đệm = dwReceiveDataLengthDWORD dwLocalAddressLength, //[IN] Kích thước phần bộ đệm// chứa địa chỉ local socketDWORD dwRemoteAddressLength,//[IN] Kích thước phần bộ đệm// chứa địa chỉ remote socketLPSOCKADDR *LocalSockaddr, //[OUT] Địa chỉ local socketLPINT LocalSockaddrLength, //[OUT] Kích thước địa chỉ local// socketLPSOCKADDR *RemoteSockaddr, //[OUT] Địa chỉ remote socketLPINT RemoteSockaddrLength //[OUT] Kích thước địa chỉ// remote socket);9Hàm TransmitFile()• Truyền file qua TCP socket• Trả về: TRUE nếu thành công• Xem thêm TransmitPacket()BOOL PASCAL TransmitFile(SOCKET hSocket,//[IN] SocketHANDLE hFile,//[IN] Handle của fileDWORD nNumberOfBytesToWrite, //[IN] Kích thước dữ liệu sẽ gửiDWORD nNumberOfBytesPerSend, //[IN] Kích thước mỗi// block(=0:default)LPOVERLAPPED lpOverlapped,//[IN] Cấu trúc OVERLAPPED chứa// kết quả//[IN] Dữ liệu cần truyền ngoài dữ liệu của fileLPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,DWORD dwFlags//[IN] Cờ điều khiển);105
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình mạng: Bài 4 - Bùi Trọng TùngBÀI 4.LẬP TRÌNH WINSOCK NÂNG CAO1Nội dung• Xây dựng ứng dụng yêu cầu lớn (Scalable Apps)• Sử dụng raw socket• Xây dựng ứng dụng broadcast và multicast211. XÂY DỰNG ỨNG DỤNG YÊU CẦU LỚN3Ứng dụng yêu cầu lớn(Scalable Apps)• Ứng dụng cần xử lý số lượng kết nối, yêu cầu rất lớn• Sử dụng các hàm WinSock API hiệu năng cao• AcceptEx()• ConnectEx()• TransmitFile()• TransmitPacket()• …• Sử dụng kỹ thuật vào ra Overlapped I/O với CompletionPort• Cần có các kỹ thuật kiểm soát số lượng kết nối, quản lýtài nguyên42Hàm AcceptEx()• Chấp nhận một kết nối và (có thể) nhận gói tin đầu tiên• Bộ đệm chứa dữ liệu nhận được và thông tin địa chỉ• sAcceptSocket phải ở trạng thái chưa kết nối• Trả về TRUE nếu thành côngBOOL AcceptEx(SOCKET sListenSocket,//[IN] Socket nghe yêu cầuSOCKET sAcceptSocket,//[IN] Socket chấp nhận kết nốiPVOID lpOutputBuffer,//[IN] Bộ đệm nhận dữ liệuDWORD dwReceiveDataLength, //[IN] Kích thước bộ đệmDWORD dwLocalAddressLength,//[IN] Kích thước phần bộ đệm// chứa địa chỉ local socketDWORD dwRemoteAddressLength, //[IN] Kích thước phần bộ đệm// chứa địa chỉ remote socketLPDWORD lpdwBytesReceived,//[OUT] Kích thước dữ// liệu đã nhậnLPOVERLAPPED lpOverlapped//[IN] Kết quả vào ra);5Sử dụng AcceptEx()SOCKET listenSock, accSock;HANDLE hCompPort;LPFN_ACCEPTEX lpfnAcceptEx=NULL;GUID GuidAcceptEx=WSAID_ACCEPTEX;PER_IO_DATAol;SOCKADDR_IN saLocal;DWORD dwBytes;char buf[1024];int buflen=1024;// Create the completion porthCompPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL, (ULONG_PTR)0, 0);// Create the listening socketlistenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// Associate listening socket to completion portCreateIoCompletionPort((HANDLE) listenSock, hCompPort,(ULONG_PTR)0, 0);63Sử dụng AcceptEx()// Bind the socket to the local portsalocal.sin_family = AF_INET;salocal.sin_port= htons(5150);salocal.sin_addr.s_addr = htonl(INADDR_ANY);bind(listenSock, (SOCKADDR *)&saLocal, sizeof(salocal));// Set the socket to listeninglisten(listenSock, 200);// Load the AcceptEx functionWSAIoctl(listenSock,SIO_GET_EXTENSION_FUNCTION_POINTER,GuidAcceptEx,sizeof(GuidAcceptEx),&lpfnAcceptEx,sizeof(lpfnAcceptEx),&dwBytes, NULL, NULL);Gọi hàmAcceptEx() khichạy hiệu năngtốt hơn7Sử dụng AcceptEx()// Create the client socket for the accepted connectionaccSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// Initialize our extended overlapped structurememset(&ol, 0, sizeof(ol));ol.operation = OP_ACCEPTEX;ol.client= accSock;lpfnAcceptEx(listenSock, accSock, buf,buflen - ((sizeof(SOCKADDR_IN) + 16) * 2),sizeof(SOCKADDR_IN) + 16,sizeof(SOCKADDR_IN) + 16,&dwBytes, &ol.overlapped);// Call GetQueuedCompletionStatus within the completion//function After the AcceptEx() operation completes associate//the accepted client socket with the completion port84Hàm GetAcceptExSockaddrs()• Lấy thông tin địa chỉ từ dữ liệu của hàm AcceptEx()void GetAcceptExSockaddrs(PVOID lpOutputBuffer,//[IN] Bộ đệm nhận dữ liệu// sử dụng trong AcceptEx()DWORD dwReceiveDataLength, //[IN] Kích thước dữ liệu trong// bộ đệm = dwReceiveDataLengthDWORD dwLocalAddressLength, //[IN] Kích thước phần bộ đệm// chứa địa chỉ local socketDWORD dwRemoteAddressLength,//[IN] Kích thước phần bộ đệm// chứa địa chỉ remote socketLPSOCKADDR *LocalSockaddr, //[OUT] Địa chỉ local socketLPINT LocalSockaddrLength, //[OUT] Kích thước địa chỉ local// socketLPSOCKADDR *RemoteSockaddr, //[OUT] Địa chỉ remote socketLPINT RemoteSockaddrLength //[OUT] Kích thước địa chỉ// remote socket);9Hàm TransmitFile()• Truyền file qua TCP socket• Trả về: TRUE nếu thành công• Xem thêm TransmitPacket()BOOL PASCAL TransmitFile(SOCKET hSocket,//[IN] SocketHANDLE hFile,//[IN] Handle của fileDWORD nNumberOfBytesToWrite, //[IN] Kích thước dữ liệu sẽ gửiDWORD nNumberOfBytesPerSend, //[IN] Kích thước mỗi// block(=0:default)LPOVERLAPPED lpOverlapped,//[IN] Cấu trúc OVERLAPPED chứa// kết quả//[IN] Dữ liệu cần truyền ngoài dữ liệu của fileLPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,DWORD dwFlags//[IN] Cờ điều khiển);105
Tìm kiếm theo từ khóa liên quan:
Bài giảng Lập trình mạng Lập trình mạng Mạng máy tính Lập trình WinSock nâng cao Lập trình WinSock nâng cao Sử dụng raw socketGợi ý tài liệu liên quan:
-
Giáo án Tin học lớp 9 (Trọn bộ cả năm)
149 trang 262 0 0 -
Ngân hàng câu hỏi trắc nghiệm môn mạng máy tính
99 trang 250 1 0 -
Giáo trình Hệ thống mạng máy tính CCNA (Tập 4): Phần 2
102 trang 242 0 0 -
47 trang 236 3 0
-
Đề cương chi tiết học phần Thiết kế và cài đặt mạng
3 trang 234 0 0 -
80 trang 213 0 0
-
122 trang 210 0 0
-
Giáo trình Hệ thống mạng máy tính CCNA (Tập 4): Phần 1
122 trang 208 0 0 -
Giáo trình môn học/mô đun: Mạng máy tính (Ngành/nghề: Quản trị mạng máy tính) - Phần 1
68 trang 199 0 0 -
Giáo trình căn bản về mạng máy tính -Lê Đình Danh 2
23 trang 186 0 0