lập trình mạng nguyễn cao đạt chương 2 lập trình mạng trong window sinhvienzone com

37 51 0
lập trình mạng nguyễn cao đạt chương 2 lập trình mạng trong window sinhvienzone com

Đ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

Si nh Vi en Zo ne C om Chương 2: Lập trình mạng windows SinhVienZone.com https://fb.com/sinhvienzonevn Chương Giới thiệu thư viện winsock om C ne - Zo - nh Vi en - Giao tiếp lập trình mạng cho phép phát triển ứng dụng giao tiếp máy nhiều máy khác thông qua môi trường mạng Winsock hỗ trợ sẵn windows cho phép lập trình mạng với giao thức TCP/IP IPX Lập trình Winsock windows ta sử dụng thư viện WINSOCK2.H, WS2_32.LIB Phiên winsock hỗ trợ cho hệ điều hành Windows sau: Si - SinhVienZone.com https://fb.com/sinhvienzonevn Chương Giới thiệu thư viện winsock ne nh Vi en Zo int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); C om Khởi động Winsock Trước chạy ứng dụng winsock cần khởi động thư viện winsock, winsock DLL hàm WSAStartup Si wVersionRequested : version winsock lpWSAData : trỏ tới struct LPWSADATA SinhVienZone.com https://fb.com/sinhvienzonevn Chương Giới thiệu thư viện winsock Si nh Vi en Zo ne C om 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; SinhVienZone.com https://fb.com/sinhvienzonevn Chương Giới thiệu thư viện winsock Si nh Vi en Zo ne C om Kết thúc Winsock Gọi hàm int WSACleanup(void); SinhVienZone.com https://fb.com/sinhvienzonevn Chương 2 Tạo socket windows Zo ne C om Cú pháp SOCKET socket ( int af, int type, int protocol ); nh Vi en af: họ địa giao thức, thiết lập AF_INET ta sử dụng IPv4 type: kiểu giao thức socket, thiết lập SOCK_STREAM cho TCP/IP, SOCK_DGRAM cho UDP/IP Protocol: thiết lập IPPROTO_TCP TCP, IPPROTO_UDP UDP Si - SinhVienZone.com https://fb.com/sinhvienzonevn Chương 2 Tạo socket windows Địa om - ne SOCKADDR_IN structure có dạng sau struct sockaddr_in nh Vi en u_short sin_port; Zo { short sin_family; C winsock quản lý địa thông qua SOCKADDR_IN structure struct in_addr sin_addr; Si char sin_zero[8]; }; sin_family : AF_INET sin_addr : lưu trữ địa IP sin_port : port sin_zero : make the SOCKADDR_IN structure the same size as the SOCKADDR structure SinhVienZone.com https://fb.com/sinhvienzonevn Chương client socket bind Address resolution connect Si listen nh Vi en Zo ne socket C Server om Xây dựng chương trình giao tiếp có kết nối dùng winsock accept SinhVienZone.com https://fb.com/sinhvienzonevn Chương om Xây dựng chương trình giao tiếp có kết nối dùng winsock C 3.1 Server ne binding: Zo int bind( nh Vi en SOCKET s, const struct sockaddr FAR* name, int namelen ); s: socket Si Khi socket tạo cần dùng hàm bind để bind tới địa name: kiểu địa socket struct sockaddr namelen: kích thước name SinhVienZone.com https://fb.com/sinhvienzonevn Chương om Xây dựng chương trình giao tiếp có kết nối dùng winsock nh Vi en int port = 5150; Zo SOCKADDR_IN tcpaddr; ne SOCKET s; C Đoạn lệnh tạo socket bind s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); tcpaddr.sin_family = AF_INET; Si tcpaddr.sin_port = htons(port); tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(s, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr)); SinhVienZone.com https://fb.com/sinhvienzonevn Chương Truyền/nhận liệu om Hàm WSARecv int WSARecv( C SOCKET s, Zo DWORD dwBufferCount, ne LPWSABUF lpBuffers, nh Vi en LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, ); Si LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine SinhVienZone.com https://fb.com/sinhvienzonevn Chương client socket Zo ne socket C Server om Xây dựng chương trình giao tiếp khơng kết nối dùng winsock nh Vi en bind sendto Si recvfrom Address resolution SinhVienZone.com https://fb.com/sinhvienzonevn Chương om Xây dựng chương trình giao tiếp không kết nối dùng winsock Hàm recvfrom C int recvfrom( ne SOCKET s, Zo char FAR* buf, nh Vi en int len, int flags, struct sockaddr FAR* from, ); Si int FAR* fromlen flags : MSG_OOB or MSG_PEEK SinhVienZone.com https://fb.com/sinhvienzonevn Chương om 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 C #include ne #pragma comment(lib, "wsock32.lib") { nh Vi en WSADATA wsaData; Zo void main(void) SOCKET ReceivingSocket; SOCKADDR_IN ReceiverAddr; int Port = 5150; Si char ReceiveBuf[1024]; int BufLength = 1024; SOCKADDR_IN SenderAddr; int SenderAddrSize = sizeof(SenderAddr); // Initialize Winsock version 2.2 WSAStartup(MAKEWORD(2 2) &wsaData); SinhVienZone.com https://fb.com/sinhvienzonevn Chương om Xây dựng chương trình giao tiếp khơng kết nối dùng winsock // Create a new socket to receive datagrams on .C Ví dụ hàm recvfrom ne ReceivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Set up a SOCKADDR_IN structure that will tell bind that we Zo // want to receive datagrams from all interfaces using port nh Vi en // 5150 ReceiverAddr.sin_family = AF_INET; ReceiverAddr.sin_port = htons(Port); ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY); Si // Associate the address information with the socket using bind bind(ReceivingSocket, (SOCKADDR *)&SenderAddr, sizeof(SenderAddr)); SinhVienZone.com https://fb.com/sinhvienzonevn Chương om 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 ne C // At this point you can receive datagrams on your bound socket recvfrom(ReceivingSocket, ReceiveBuf, BufLength, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize); // the socket nh Vi en closesocket(ReceivingSocket); Zo // When your application is finished receiving datagrams close // When your application is finished call WSACleanup WSACleanup(); Si } SinhVienZone.com https://fb.com/sinhvienzonevn Chương om Xây dựng chương trình giao tiếp khơng kết nối dùng winsock hàm sendto C int sendto( ne SOCKET s, Zo const char FAR * buf, nh Vi en int len, int flags, const struct sockaddr FAR * to, ); Si int tolen to : trỏ tới địa cần send tới SinhVienZone.com https://fb.com/sinhvienzonevn Chương om 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 C #include ne #pragma comment(lib, "wsock32.lib") void main(void) nh Vi en WSADATA wsaData; Zo { SOCKET SendingSocket; SOCKADDR_IN ReceiverAddr; int Port = 5150; Si char SendBuf[1024]; int BufLength = 1024; // 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); SinhVienZone.com https://fb.com/sinhvienzonevn Chương om 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; C ReceiverAddr.sin_port = htons(Port); ne ReceiverAddr.sin_addr.s_addr = inet_addr("136.149.3.29"); // Send a datagram to the receiver nh Vi en Zo sendto(SendingSocket, SendBuf, BufLength, 0, (SOCKADDR *)&ReceiverAddr, sizeof(RecieverAddr)); // When your application is finished sending datagrams close // the socket closesocket(SendingSocket); WSACleanup(); Si // When your application is finished call WSACleanup } SinhVienZone.com https://fb.com/sinhvienzonevn Chương Chế độ blocking socket om Nhận xét đoạn chương trình: SOCKET sock; C char buff[256]; ne int done = 0, nBytes; Zo nh Vi en while(!done) { nBytes = recv(sock, buff, 65); if (nBytes == SOCKET_ERROR) Return; } Si { printf("recv failed with error %d\n", WSAGetLastError()); DoComputationOnData(buff); } SinhVienZone.com https://fb.com/sinhvienzonevn Chương Chế độ blocking socket Si nh Vi en Zo ne C Giải pháp khác phục: tạo luồng nhận xử lý riêng rẽ om Đoạn chương trình có trường hợp hàm rev không nhận đủ liệu phục vụ cho tác vụ khơng có liệu gửi tới lý đó, lúc chương trình bị chờ mãi SinhVienZone.com https://fb.com/sinhvienzonevn Chương Chế độ blocking socket om #define MAX_BUFFER_SIZE 4096 // an auto-reset event (hEvent) before creating the ne // two threads CRITICAL_SECTION data; Zo HANDLE hEvent; C // Initialize critical section (data) and create nh Vi en SOCKET sock; TCHAR buff[MAX_BUFFER_SIZE]; int done=0; // Reader thread Si // Create and connect sock SinhVienZone.com https://fb.com/sinhvienzonevn Chương Chế độ blocking socket om void ReadThread(void) { C int nTotal = 0, ne nRead = 0, nLeft = 0, Zo nBytes = 0; nh Vi en while (!done) { nTotal = 0; nLeft = NUM_BYTES_REQUIRED; Si // However many bytes constitutes // enough data for processing // (i.e non-zero) SinhVienZone.com https://fb.com/sinhvienzonevn Chương Chế độ blocking socket om while (nTotal != NUM_BYTES_REQUIRED) { C EnterCriticalSection(&data); ne nRead = recv(sock, &(buff[MAX_BUFFER_SIZE - nBytes]), nLeft, 0); if (nRead == -1) Zo { printf("error\n"); nh Vi en ExitThread(); } nTotal += nRead; nLeft -= nRead; nBytes += nRead; Si LeaveCriticalSection(&data); } SetEvent(hEvent); } } SinhVienZone.com https://fb.com/sinhvienzonevn Chương Chế độ blocking socket om // Computation thread void ProcessThread(void) C { ne WaitForSingleObject(hEvent); DoSomeComputationOnData(buff); Zo EnterCriticalSection(&data); nh Vi en // Remove the processed data from the input // buffer, and shift the remaining data to // the start of the array nBytes -= NUM_BYTES_REQUIRED; } Si LeaveCriticalSection(&data); SinhVienZone.com https://fb.com/sinhvienzonevn ... cho phép lập trình mạng với giao thức TCP/IP IPX Lập trình Winsock windows ta sử dụng thư viện WINSOCK2.H, WS2_ 32. LIB Phiên winsock hỗ trợ cho hệ điều hành Windows sau: Si - SinhVienZone. com https://fb .com/ sinhvienzonevn... SOCKADDR_IN structure SinhVienZone. com https://fb .com/ sinhvienzonevn Chương om Xây dựng chương trình giao tiếp có kết nối dùng winsock C Chương trình phía server: #pragma comment(lib, "wsock 32. lib") Zo... WSAStartup(MAKEWORD (2, 2), &wsaData); SinhVienZone. com https://fb .com/ sinhvienzonevn Chương Chương trình phía server: C // Create a new socket to listen for client connections om Xây dựng chương trình giao

Ngày đăng: 30/01/2020, 22:43

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