Sebagai sistem sumber terbuka, sistem pengendalian Linux telah menunjukkan prestasi yang baik dalam bidang komunikasi rangkaian, dan susunan protokolnya dianggap sebagai salah satu komponen utama. Dalam artikel ini, kami akan memberikan penjelasan yang mendalam tentang komponen utama susunan protokol Linux, termasuk antara muka rangkaian, soket, susunan protokol TCP/IP, dsb., dan menggunakan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik.
Antara muka rangkaian ialah komponen paling rendah dalam susunan protokol Linux dan bertanggungjawab untuk menghantar dan menerima paket data rangkaian. Di Linux, antara muka rangkaian dilaksanakan melalui pemacu peranti, dan setiap antara muka rangkaian mempunyai pengecam unik, seperti eth0, eth1, dsb. Kita boleh melihat maklumat antara muka rangkaian dalam sistem semasa melalui arahan ifconfig, seperti yang ditunjukkan di bawah:
ifconfig
Di Linux, struktur alamat soket antara muka rangkaian ditakrifkan dalam <linux/if.h></ kod > Dalam fail pengepala, pengaturcara boleh mencipta soket yang terikat pada antara muka rangkaian yang ditentukan dengan memanggil socket() dan bind(). Berikut ialah contoh kod mudah: <code><linux/if.h>
头文件中,程序员可以通过调用socket()和bind()来创建一个绑定到指定网络接口的套接字。下面是一个简单的示例代码:
#include <sys/types.h> #include <sys/socket.h> #include <linux/if.h> int main() { int sockfd; struct sockaddr sa; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { perror("socket"); return -1; } struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, "eth0"); if(setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, (void*)&ifr, sizeof(ifr)) < 0) { perror("setsockopt"); close(sockfd); return -1; } close(sockfd); }
套接字是Linux协议栈中的中间件,负责处理应用层和传输层之间的通信。在Linux中,套接字接口定义在<sys/socket.h>
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <string.h> #define PORT 8080 int main() { int sockfd, new_sockfd; struct sockaddr_in server_addr, client_addr; char buffer[1024]; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("socket"); return -1; } server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); if(bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); return -1; } listen(sockfd, 5); while(1) { int addrlen = sizeof(client_addr); new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen); memset(buffer, 0, sizeof(buffer)); read(new_sockfd, buffer, sizeof(buffer)); write(new_sockfd, buffer, strlen(buffer)); close(new_sockfd); } close(sockfd); return 0; }
<sys/socket.h>
Pengaturcara boleh menggunakan socket(), bind(), listen(), accept(), connect (). dan fungsi lain untuk mencipta dan mengurus soket. Berikut ialah kod contoh pelayan TCP ringkas yang melaksanakan pelayan Echo berasaskan soket ringkas: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #define PORT 8080 #define SERVER_IP "127.0.0.1" int main() { int sockfd; struct sockaddr_in server_addr; char buffer[1024]; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("socket"); return -1; } server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(PORT); if(connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); return -1; } strcpy(buffer, "Hello, Server!"); write(sockfd, buffer, strlen(buffer)); memset(buffer, 0, sizeof(buffer)); read(sockfd, buffer, sizeof(buffer)); printf("Server response: %s ", buffer); close(sockfd); return 0; }
Atas ialah kandungan terperinci Penjelasan mendalam tentang komponen utama susunan protokol Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!