Lỗi ổ cắm là hiện tượng rất phổ biến trong giao tiếp mạng và lỗi này có thể xảy ra ở nhiều giai đoạn của quy trình bao gồm thiết lập kết nối, truyền dữ liệu và ngắt kết nối. Những lỗi này có thể do nhiều yếu tố gây ra, chẳng hạn như lỗi mạng, hết thời gian kết nối, giới hạn tài nguyên hoặc cài đặt cấu hình không chính xác.
Chúng ta hãy thảo luận về hai cách tiếp cận khác nhau về cách phát hiện lỗi socket trong ngôn ngữ lập trình C bằng cách sử dụng hàm “perror()” và “strerror()”.
Lỗi socket là gì?
Các lỗi socket trong ngôn ngữ C chủ yếu được xác định bằng giá trị trả về âm hoặc mã lỗi cụ thể được trả về bởi các hàm socket. Các mã lỗi này cung cấp thông tin có giá trị về bản chất của lỗi và giúp chúng tôi phát hiện cũng như giải quyết vấn đề. Nếu hàm socket trả về giá trị âm, điều đó có nghĩa là đã xảy ra lỗi nào đó tại thời điểm thực thi. Ví dụ:nếu hàm “socket()” không tạo được ổ cắm, nó có thể trả về giá trị âm để biểu thị lỗi. Chúng ta có thể dễ dàng phát hiện và ứng phó với những lỗi như vậy bằng cách kiểm tra phần này.
Ngoài các giá trị trả về âm, các hàm socket còn đặt biến “errno” là biến toàn cục lưu trữ mã lỗi cụ thể có liên quan đến lệnh gọi hàm hệ thống hoặc thư viện gần đây nhất. Biến “errno” có thể được truy cập bằng tệp tiêu đề “
Ví dụ lập trình 1:Phát hiện lỗi socket bằng hàm Strerror()
Chức năng
#include
#include
#include
#include
#include
#include
int chính ()
{
int socketDescriptor;
struct sockaddr_in serverAddress;
// Tạo một ổ cắm
socketDescriptor =ổ cắm (AF_INET, SOCK_STREAM, 0);
if (socketDescriptor <0)
{
perror ("Tạo socket không thành công");
thoát (EXIT_FAILURE);
// Thiết lập địa chỉ máy chủ
serverAddress.sin_family =AF_INET;
// Chúng ta hãy sử dụng một số cổng ví dụ
serverAddress.sin_port =htons (7070);
// Địa chỉ IP cục bộ
serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
// Kết nối với máy chủ
if (kết nối (socketDescriptor, (struct sockaddr * ) &serverAddress, sizeof (serverAddress)) <0)
{
perror ("Kết nối thất bại");
thoát (EXIT_FAILURE);
}
// Gửi và nhận dữ liệu
// Chúng ta hãy đóng socket
đóng (socketDescriptor);
trả về 0;
Đầu ra:
$ gcc err.c -o err
$ ./err
Kết nối không thành công:Kết nối bị từ chối
Giải thích:
Trong ví dụ lập trình này, chúng ta sử dụng hàm socket() để tạo một socket. Nếu bộ mô tả socket được trả về nhỏ hơn 0, điều này cho biết có lỗi trong quá trình tạo socket, thì nó sẽ sử dụng hàm “perror()” để hiển thị thông báo lỗi tương ứng và thoát khỏi chương trình. Để thiết lập kết nối, nó sẽ thiết lập địa chỉ máy chủ và cố gắng kết nối bằng hàm connect() để kiểm tra xem giá trị trả về có nhỏ hơn 0 hay không. Trong trường hợp kết nối không thành công, hàm “perror()” được sử dụng lại để hiển thị thông báo lỗi và chương trình sẽ thoát. Với cách làm này, chúng ta có thể dễ dàng nắm bắt được lỗi socket trong ngôn ngữ C. Điều này cho phép chúng tôi hiển thị các thông báo lỗi mang tính thông tin và chấm dứt chương trình một cách hợp lý.
Ví dụ lập trình 2:Bắt lỗi socket bằng hàm Perror()
#include
#include
#include
#include
#include
#include
#include
#include
int chính ()
{
int socketDescriptor;
struct sockaddr_in serverAddress;
// Tạo một ổ cắm
socketDescriptor =ổ cắm (AF_INET, SOCK_STREAM, 0);
if (socketDescriptor <0)
{
fprintf (stderr, "Không tạo được socket:%s \n", strerror (errno));
thoát (EXIT_FAILURE);
// Thiết lập địa chỉ máy chủ
serverAddress.sin_family =AF_INET;
// Chúng ta hãy sử dụng một số cổng ví dụ
serverAddress.sin_port =htons (7070);
// Địa chỉ IP cục bộ
serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
// bây giờ chúng tôi thử kết nối máy chủ
if (kết nối (socketDescriptor, (struct sockaddr *) &serverAddress, sizeof (serverAddress)) <0) {
fprintf (stderr, "Không thể kết nối:%s\n", strerror (errno));
thoát (EXIT_FAILURE);
// Gửi và nhận dữ liệu
// Đóng ổ cắm
if (đóng (socketDescriptor) <0)
{
fprintf (stderr, "Đóng socket không thành công:%s\n", strerror (errno));
thoát (EXIT_FAILURE);
}
printf ("Socket đã đóng thành công.\n");
trả về 0;
Đầu ra:
$ gcc error.c -o lỗi
$ ./lỗi
Không kết nối được:Kết nối bị từ chối
Giải thích:
Trong ví dụ lập trình này, chúng ta phát hiện các lỗi socket trong C bằng cách sử dụng hàm “strerror()”. Hàm này cho phép chúng ta chuyển đổi mã lỗi được lưu trữ trong biến “errno” thành thông báo lỗi mà con người có thể đọc được. Bằng cách bao gồm tệp tiêu đề “
Kết luận
Bằng cách hiểu các giá trị trả về và mã lỗi do các hàm socket cung cấp, chúng ta có thể dễ dàng nắm bắt và xử lý các lỗi socket này trong C. Trong ví dụ lập trình đầu tiên, chúng tôi đã giải thích cách bắt lỗi và trả về các giá trị bằng hàm “perror()”. Trong ví dụ thứ hai, chúng tôi đã giải thích hàm “strerror()” để nhận các thông báo lỗi chi tiết. Bằng cách hiểu các phương pháp này, chúng tôi có thể hiển thị các thông báo lỗi mang tính thông tin và chấm dứt đúng cách các chương trình của chúng tôi trong lập trình socket.
Giới thiệu về tác giả
Bamdeb Ghosh
Bamdeb Ghosh đang có kinh nghiệm thực tế trong lĩnh vực Mạng không dây. Anh ấy là chuyên gia về phân tích chụp Wireshark trên Mạng không dây hoặc Mạng có dây cùng với kiến thức về các lệnh Android, Bluetooth, Linux và python. Theo dõi trang web của anh ấy:wifisharks.com