
Lỗi socket thường gặp trong giao tiếp mạng, xảy ra ở nhiều giai đoạn: thiết lập kết nối, truyền dữ liệu, ngắt kết nối. Nguyên nhân: lỗi mạng, timeout, giới hạn tài nguyên, cấu hình sai. Bài viết trình bày hai cách bắt lỗi socket trong C dùng perror() và strerror().
Lỗi Socket là gì?
Lỗi socket trong C được xác định bằng giá trị trả về âm hoặc mã lỗi cụ thể từ hàm socket. Nếu hàm trả về giá trị âm, có lỗi xảy ra. Ví dụ socket() thất bại trả về âm. Biến toàn cục errno (header errno.h) lưu mã lỗi của lời gọi hệ thống/thư viện gần nhất. Hiểu giá trị trả về và mã lỗi giúp xác định nguyên nhân và xử lý.
Ví dụ 1: Bắt lỗi dùng perror()
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int socketDescriptor;
struct sockaddr_in serverAddress;
socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
if (socketDescriptor < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(7070);
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(socketDescriptor, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
perror("Connection failed");
exit(EXIT_FAILURE);
}
// Gửi/nhận dữ liệu...
close(socketDescriptor);
return 0;
}
Kết quả:
$ gcc err.c -o err
$ ./err
Connection failed: Connection refused
perror() in thông báo lỗi kèm mô tả từ errno ra stderr.
Ví dụ 2: Bắt lỗi dùng strerror()
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
int main() {
int socketDescriptor;
struct sockaddr_in serverAddress;
socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
if (socketDescriptor < 0) {
fprintf(stderr, "Failed to create socket: %s \n", strerror(errno));
exit(EXIT_FAILURE);
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(7070);
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(socketDescriptor, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
fprintf(stderr, "Failed to connect: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
// Gửi/nhận dữ liệu...
if (close(socketDescriptor) < 0) {
fprintf(stderr, "Socket closure failed: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("Socket closed successfully.\n");
return 0;
}
Kết quả:
$ gcc error.c -o error
$ ./error
Failed to connect: Connection refused
strerror(errno) chuyển mã lỗi thành chuỗi mô tả đọc được, in ra qua fprintf(stderr, ...).
Kết luận
Hiểu giá trị trả về và mã lỗi từ hàm socket giúp bắt và xử lý lỗi socket trong C. Ví dụ 1 dùng perror(), ví dụ 2 dùng strerror() để có thông báo chi tiết. Áp dụng các phương pháp này để hiển thị lỗi rõ ràng và kết thúc chương trình an toàn.
Tác giả

Bamdeb Ghosh
Chuyên gia mạng không dây, phân tích Wireshark, am hiểu Android, Bluetooth, Linux, Python. Trang web: wifisharks.com