Bài giảng "Lập trình mạng - Bài 3: Các chế độ vào ra trên WinSock" cung cấp cho người học các kiến thức: Chế độ vào ra blocking và non-blocking, kỹ thuật đa luồng, kỹ thuật thăm dò, kỹ thuật vào ra theo thông báo. nội dung chi tiết. | 25/01/2016 BÀI 2. CÁC CHẾ ĐỘ VÀO RA TRÊN WINSOCK 1 Nội dung • Chế độ vào ra blocking và non-blocking • Kỹ thuật đa luồng • Kỹ thuật thăm dò • Kỹ thuật vào ra theo thông báo • Kỹ thuật vào ra theo sự kiện • Kỹ thuật Overlapped 2 1 25/01/2016 1. CÁC CHẾ ĐỘ VÀO RA 3 Xem lại TCP Echo Server • Nhận xét: Chỉ làm việc được với 1 client • Hàm recv() chỉ trả về khi nhận được dữ liệu trên socket tiến trình bị chặn, không thể thực hiện lời gọi hàm accept() để xử lý kết nối của client khác //Step 5: Communicate with client sockaddr_in clientAddr; char buff[1024]; int ret, clientAddrLen = sizeof(clientAddr); while(1){ SOCKET connSock; //accept request connSock = accept(listenSock, (sockaddr *) & clientAddr, &clientAddrLen); //receive message from client ret = recv(connSock, buff, 1024, 0); //. 4 2 25/01/2016 Ví dụ mở đầu • Viết ứng dụng cho phép client và server trao đổi thông điệp do người dùng nhập từ bàn phím(sử dụng TCP hoặc UDP tùy ý) 5 Client (sử dụng lại TCP Echo client) //Step 5: Communicate with server char buff[1024]; int ret, serverAddrLen = sizeof(serverAddr); do { //Send message to server printf("Send to server: "); gets_s(buff, 1024); ret = send (client, buff, strlen(buff), 0); //Receive message from server ret = recv (client, buff, 1024, 0); printf("Receive from server: %s\n", buff); _strupr_s(buff, 1024); }while(strcmp(buff, "BYE") != 0); //end while //. 6 3 25/01/2016 Server //Step 5: Communicate with client while(1){ SOCKET connSock; //accept request connSock = accept(listenSock, (sockaddr *) & clientAddr, &clientAddrLen); do{ //receive message from client ret = recv(connSock, buff, 1024, 0); printf("Receive from client: %s\n", buff); //send message to server printf("Send to client: "); gets_s(buff, 1024); ret = send (client, buff, strlen(buff), 0); _strupr_s(buff, 1024); } while(strcmp(buff, "BYE") != 0); 7 Nhận xét • Mỗi bên chỉ gửi lần lượt được 1 thông điệp • Server chưa thể gửi khi client chưa gửi • và ngược lại • Giải .