intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Lập trình mạng: Bài 4 - Bùi Trọng Tùng

Chia sẻ: N N | Ngày: | Loại File: PDF | Số trang:20

79
lượt xem
7
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Lập trình mạng: Bài 4 - Bùi Trọng Tùng

BÀI 4.<br /> LẬP TRÌNH WINSOCK NÂNG CAO<br /> <br /> 1<br /> <br /> Nội dung<br /> • Xây dựng ứng dụng yêu cầu lớn (Scalable Apps)<br /> • Sử dụng raw socket<br /> • Xây dựng ứng dụng broadcast và multicast<br /> <br /> 2<br /> <br /> 1<br /> <br /> 1. XÂY DỰNG ỨNG DỤNG YÊU CẦU LỚN<br /> <br /> 3<br /> <br /> Ứng dụng yêu cầu lớn(Scalable Apps)<br /> • Ứng dụng cần xử lý số lượng kết nối, yêu cầu rất lớn<br /> • Sử dụng các hàm WinSock API hiệu năng cao<br /> • AcceptEx()<br /> • ConnectEx()<br /> • TransmitFile()<br /> • TransmitPacket()<br /> • …<br /> • Sử dụng kỹ thuật vào ra Overlapped I/O với Completion<br /> <br /> Port<br /> • Cần có các kỹ thuật kiểm soát số lượng kết nối, quản lý<br /> tài nguyên<br /> <br /> 4<br /> <br /> 2<br /> <br /> Hàm AcceptEx()<br /> • Chấp nhận một kết nối và (có thể) nhận gói tin đầu tiên<br /> • Bộ đệm chứa dữ liệu nhận được và thông tin địa chỉ<br /> • sAcceptSocket phải ở trạng thái chưa kết nối<br /> • Trả về TRUE nếu thành công<br /> BOOL AcceptEx(<br /> SOCKET sListenSocket,<br /> //[IN] Socket nghe yêu cầu<br /> SOCKET sAcceptSocket,<br /> //[IN] Socket chấp nhận kết nối<br /> PVOID lpOutputBuffer,<br /> //[IN] Bộ đệm nhận dữ liệu<br /> DWORD dwReceiveDataLength, //[IN] Kích thước bộ đệm<br /> DWORD dwLocalAddressLength,//[IN] Kích thước phần bộ đệm<br /> // chứa địa chỉ local socket<br /> DWORD dwRemoteAddressLength, //[IN] Kích thước phần bộ đệm<br /> // chứa địa chỉ remote socket<br /> LPDWORD lpdwBytesReceived,<br /> //[OUT] Kích thước dữ<br /> // liệu đã nhận<br /> LPOVERLAPPED lpOverlapped<br /> //[IN] Kết quả vào ra<br /> );<br /> <br /> 5<br /> <br /> Sử dụng AcceptEx()<br /> SOCKET listenSock, accSock;<br /> HANDLE hCompPort;<br /> LPFN_ACCEPTEX lpfnAcceptEx=NULL;<br /> GUID GuidAcceptEx=WSAID_ACCEPTEX;<br /> PER_IO_DATA<br /> ol;<br /> SOCKADDR_IN saLocal;<br /> DWORD dwBytes;<br /> char buf[1024];<br /> int buflen=1024;<br /> // Create the completion port<br /> hCompPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,<br /> NULL, (ULONG_PTR)0, 0);<br /> // Create the listening socket<br /> listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br /> // Associate listening socket to completion port<br /> CreateIoCompletionPort((HANDLE) listenSock, hCompPort,<br /> (ULONG_PTR)0, 0);<br /> <br /> 6<br /> <br /> 3<br /> <br /> Sử dụng AcceptEx()<br /> // Bind the socket to the local port<br /> salocal.sin_family = AF_INET;<br /> salocal.sin_port<br /> = htons(5150);<br /> salocal.sin_addr.s_addr = htonl(INADDR_ANY);<br /> bind(listenSock, (SOCKADDR *)&saLocal, sizeof(salocal));<br /> // Set the socket to listening<br /> listen(listenSock, 200);<br /> // Load the AcceptEx function<br /> WSAIoctl(listenSock,<br /> SIO_GET_EXTENSION_FUNCTION_POINTER,<br /> GuidAcceptEx,<br /> sizeof(GuidAcceptEx),<br /> &lpfnAcceptEx,<br /> sizeof(lpfnAcceptEx),<br /> &dwBytes, NULL, NULL);<br /> <br /> Gọi hàm<br /> AcceptEx() khi<br /> chạy  hiệu năng<br /> tốt hơn<br /> <br /> 7<br /> <br /> Sử dụng AcceptEx()<br /> // Create the client socket for the accepted connection<br /> accSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br /> // Initialize our "extended" overlapped structure<br /> memset(&ol, 0, sizeof(ol));<br /> ol.operation = OP_ACCEPTEX;<br /> ol.client<br /> = accSock;<br /> lpfnAcceptEx(listenSock, accSock, buf,<br /> buflen - ((sizeof(SOCKADDR_IN) + 16) * 2),<br /> sizeof(SOCKADDR_IN) + 16,<br /> sizeof(SOCKADDR_IN) + 16,<br /> &dwBytes, &ol.overlapped);<br /> // Call GetQueuedCompletionStatus within the completion<br /> //function After the AcceptEx() operation completes associate<br /> //the accepted client socket with the completion port<br /> <br /> 8<br /> <br /> 4<br /> <br /> Hàm GetAcceptExSockaddrs()<br /> • Lấy thông tin địa chỉ từ dữ liệu của hàm AcceptEx()<br /> void GetAcceptExSockaddrs(<br /> PVOID lpOutputBuffer,<br /> <br /> //[IN] Bộ đệm nhận dữ liệu<br /> // sử dụng trong AcceptEx()<br /> DWORD dwReceiveDataLength, //[IN] Kích thước dữ liệu trong<br /> // bộ đệm = dwReceiveDataLength<br /> DWORD dwLocalAddressLength, //[IN] Kích thước phần bộ đệm<br /> // chứa địa chỉ local socket<br /> DWORD dwRemoteAddressLength,//[IN] Kích thước phần bộ đệm<br /> // chứa địa chỉ remote socket<br /> LPSOCKADDR *LocalSockaddr, //[OUT] Địa chỉ local socket<br /> LPINT LocalSockaddrLength, //[OUT] Kích thước địa chỉ local<br /> // socket<br /> LPSOCKADDR *RemoteSockaddr, //[OUT] Địa chỉ remote socket<br /> LPINT RemoteSockaddrLength //[OUT] Kích thước địa chỉ<br /> // remote socket<br /> );<br /> <br /> 9<br /> <br /> Hàm TransmitFile()<br /> • Truyền file qua TCP socket<br /> • Trả về: TRUE nếu thành công<br /> • Xem thêm TransmitPacket()<br /> BOOL PASCAL TransmitFile(<br /> SOCKET hSocket,<br /> //[IN] Socket<br /> HANDLE hFile,<br /> //[IN] Handle của file<br /> DWORD nNumberOfBytesToWrite, //[IN] Kích thước dữ liệu sẽ gửi<br /> DWORD nNumberOfBytesPerSend, //[IN] Kích thước mỗi<br /> // block(=0:default)<br /> LPOVERLAPPED lpOverlapped,<br /> //[IN] Cấu trúc OVERLAPPED chứa<br /> // kết quả<br /> //[IN] Dữ liệu cần truyền ngoài dữ liệu của file<br /> LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,<br /> DWORD dwFlags<br /> //[IN] Cờ điều khiển<br /> );<br /> <br /> 10<br /> <br /> 5<br /> <br />
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2