Trắc nghiệm Mạng máy tính Bài: Lập trình socket với ngôn ngữ C là một trong những đề thi thuộc Chương 5: LẬP TRÌNH SOCKET trong học phần Mạng máy tính chuyên ngành Công Nghệ Thông Tin cấp độ Đại học. Phần này đi sâu vào việc triển khai lập trình mạng ở cấp độ thấp bằng ngôn ngữ C, cho phép tương tác trực tiếp với các API hệ thống để điều khiển hoạt động mạng. Việc nắm vững lập trình socket trong C là nền tảng vững chắc để hiểu rõ nguyên lý hoạt động của các ứng dụng mạng từ cốt lõi, đặc biệt quan trọng trong các hệ thống đòi hỏi hiệu suất cao và kiểm soát chi tiết.
Trong bài học này, người học cần nắm được các nội dung trọng tâm như: các hàm API socket cơ bản (`socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, `recv()`, `close()`), các cấu trúc địa chỉ (`sockaddr_in`, `sockaddr_storage`), cách xử lý lỗi, quản lý thứ tự byte, và các phương pháp xây dựng server đa client (fork, thread). Việc hiểu rõ các kiến thức này sẽ là nền tảng vững chắc để thiết kế, triển khai và bảo trì các hệ thống mạng phức tạp bằng C.
Hãy cùng Dethitracnghiem.vn tìm hiểu về đề thi này và tham gia làm kiểm tra ngay lập tức!
Trắc nghiệm Mạng máy tính Bài: Lập trình socket với ngôn ngữ C
Câu 1.Hàm `socket()` trong C dùng để làm gì?
A. Kết nối đến một địa chỉ IP.
B. Gán một địa chỉ và cổng cho socket.
C. Lắng nghe các kết nối đến.
D. Tạo một điểm cuối truyền thông (socket) và trả về một bộ mô tả tệp (file descriptor).
Câu 2.Đối số `type` trong hàm `socket()` được đặt là `SOCK_STREAM` khi bạn muốn sử dụng giao thức tầng giao vận nào?
A. UDP (User Datagram Protocol).
B. ICMP (Internet Control Message Protocol).
C. ARP (Address Resolution Protocol).
D. TCP (Transmission Control Protocol).
Câu 3.Đối số `type` trong hàm `socket()` được đặt là `SOCK_DGRAM` khi bạn muốn sử dụng giao thức tầng giao vận nào?
A. TCP (Transmission Control Protocol).
B. HTTP (Hypertext Transfer Protocol).
C. FTP (File Transfer Protocol).
D. UDP (User Datagram Protocol).
Câu 4.Cấu trúc dữ liệu `struct sockaddr_in` trong lập trình socket C dùng để lưu trữ thông tin gì?
A. Địa chỉ MAC của máy chủ.
B. Tên miền của máy chủ.
C. Cấu hình mạng của card mạng.
D. Địa chỉ IPv4 và số cổng (port) của socket.
Câu 5.Các hàm như `htons()` và `htonl()` trong lập trình socket C được sử dụng cho mục đích gì?
A. Chuyển đổi địa chỉ IP từ chuỗi sang số nguyên.
B. Chuyển đổi địa chỉ MAC sang địa chỉ IP.
C. Mã hóa dữ liệu trước khi truyền.
D. Chuyển đổi thứ tự byte từ host byte order sang network byte order (Big-endian).
Câu 6.Hàm `bind()` trong lập trình socket C dùng để làm gì?
A. Thiết lập kết nối đến một server.
B. Chờ đợi các kết nối đến.
C. Gửi dữ liệu qua socket.
D. Gán một địa chỉ IP và số cổng cụ thể cho socket vừa tạo.
Câu 7.Nếu một server socket trong C sử dụng `INADDR_ANY` làm địa chỉ IP khi gọi `bind()`, điều đó có nghĩa là gì?
A. Server chỉ lắng nghe từ localhost.
B. Server sẽ kết nối đến một địa chỉ IP ngẫu nhiên.
C. Server sẽ chỉ lắng nghe từ một địa chỉ IP cụ thể.
D. Server sẽ lắng nghe trên tất cả các giao diện mạng khả dụng của máy tính.
Câu 8.Hàm `listen()` trong lập trình socket C có đối số `backlog` dùng để làm gì?
A. Xác định kích thước tối đa của gói tin.
B. Đặt thời gian chờ cho các kết nối.
C. Số lượng client đã kết nối thành công.
D. Chỉ định số lượng kết nối đang chờ xử lý (pending connections) mà server có thể giữ trong hàng đợi.
Câu 9.Hàm `accept()` trong lập trình socket C dùng để làm gì trong vai trò server?
A. Bắt đầu lắng nghe các kết nối.
B. Gửi dữ liệu đến client.
C. Đóng kết nối.
D. Chờ đợi và chấp nhận một kết nối đến từ client, sau đó trả về một bộ mô tả tệp cho socket mới để giao tiếp với client đó.
Câu 10.Hàm `connect()` trong lập trình socket C dùng để làm gì trong vai trò client?
A. Gán địa chỉ IP và cổng cho client socket.
B. Chờ đợi kết nối từ server.
C. Gửi dữ liệu đến server.
D. Thiết lập kết nối đến một server đã lắng nghe trên địa chỉ IP và cổng cụ thể.
Câu 11.Để gửi dữ liệu qua một socket TCP đã kết nối trong C, bạn sẽ sử dụng hàm nào?
A. `read()`
B. `recvfrom()`
C. `writev()`
D. `send()`
Câu 12.Để nhận dữ liệu qua một socket TCP đã kết nối trong C, bạn sẽ sử dụng hàm nào?
A. `write()`
B. `sendto()`
C. `readv()`
D. `recv()`
Câu 13.Để gửi dữ liệu qua một socket UDP trong C, bạn sẽ sử dụng hàm nào?
A. `send()`
B. `recv()`
C. `read()`
D. `sendto()`
Câu 14.Để nhận dữ liệu qua một socket UDP trong C, bạn sẽ sử dụng hàm nào?
A. `recv()`
B. `send()`
C. `write()`
D. `recvfrom()`
Câu 15.Sau khi hoàn thành việc giao tiếp, hàm nào nên được gọi để đóng socket và giải phóng tài nguyên hệ thống?
A. `shutdown()`
B. `release()`
C. `disconnect()`
D. `close()`
Câu 16.Khi một hàm socket trả về giá trị -1, điều đó thường có nghĩa là gì?
A. Hoạt động thành công.
B. Hoạt động đang chờ xử lý.
C. Không có dữ liệu để gửi.
D. Đã xảy ra lỗi, và chi tiết lỗi có thể được truy cập thông qua biến toàn cục `errno`.
Câu 17.Hàm `perror()` trong C được sử dụng để làm gì?
A. Ghi lỗi vào một tệp nhật ký.
B. Báo cáo lỗi mạng cho hệ thống.
C. Hiển thị thông báo lỗi tùy chỉnh.
D. In ra một thông báo lỗi mô tả lỗi cuối cùng đã xảy ra trong thư viện hệ thống hoặc hàm thư viện C.
Câu 18.Để một server C có thể xử lý nhiều client đồng thời, cách phổ biến nhất để tạo các tiến trình con là sử dụng hàm nào?
A. `pthread_create()`
B. `exec()`
C. `wait()`
D. `fork()`
Câu 19.Cờ `SO_REUSEADDR` thường được đặt cho server socket bằng hàm `setsockopt()`. Mục đích của nó là gì?
A. Tăng tốc độ truyền dữ liệu.
B. Giảm bộ nhớ sử dụng.
C. Cho phép nhiều ứng dụng cùng lắng nghe trên một cổng.
D. Cho phép socket lắng nghe lại trên một cổng đã sử dụng gần đây mà không cần chờ timeout `TIME_WAIT`.
Câu 20.Cấu trúc `struct sockaddr_in6` được sử dụng để lưu trữ thông tin địa chỉ cho phiên bản giao thức IP nào?
A. IPv4.
B. IPv4 và IPv6.
C. IPX.
D. IPv6.
Câu 21.Để chuyển đổi một địa chỉ IP dạng chuỗi (ví dụ: “192.168.1.1”) sang định dạng nhị phân trong cấu trúc địa chỉ socket, bạn sẽ sử dụng hàm nào?
A. `inet_ntoa()`
B. `inet_addr()`
C. `gethostbyname()`
D. `inet_pton()` (cho IPv4 và IPv6)
Câu 22.Để chuyển đổi một địa chỉ IP dạng nhị phân trong cấu trúc địa chỉ socket sang dạng chuỗi dễ đọc, bạn sẽ sử dụng hàm nào?
A. `inet_aton()`
B. `inet_pton()`
C. `gethostbyaddr()`
D. `inet_ntop()` (cho IPv4 và IPv6)
Câu 23.Làm thế nào để bạn biết một socket TCP đã đọc hết dữ liệu từ bên đối diện và bên đó đã đóng kết nối?
A. Hàm `recv()` trả về -1.
B. Hàm `recv()` gây lỗi.
C. Hàm `recv()` trả về một giá trị lớn hơn 0.
D. Hàm `recv()` trả về 0.
Câu 24.Nếu bạn muốn server tạo một luồng (thread) mới cho mỗi client kết nối thay vì một tiến trình (process) mới, bạn sẽ sử dụng hàm nào?
A. `fork()`
B. `exec()`
C. `wait()`
D. `pthread_create()`
Câu 25.Các tệp tiêu đề (header files) cơ bản nào là cần thiết cho hầu hết các chương trình lập trình socket trong C?
A. “, “.
B. “, “.
C. “, `<sys/types.h>`.
D. `<sys/socket.h>`, `<netinet/in.h>`, `<arpa/inet.h>`.