En tant que système open source, le système d'exploitation Linux a bien fonctionné dans le domaine des communications réseau, et sa pile de protocoles est considérée comme l'un des composants clés. Dans cet article, nous fournirons une explication détaillée des composants clés de la pile de protocoles Linux, notamment les interfaces réseau, les sockets, les piles de protocoles TCP/IP, etc., et utiliserons des exemples de code spécifiques pour aider les lecteurs à mieux comprendre.
L'interface réseau est le composant le plus bas de la pile de protocoles Linux et est responsable de l'envoi et de la réception des paquets de données réseau. Sous Linux, les interfaces réseau sont implémentées via des pilotes de périphérique et chaque interface réseau possède un identifiant unique, tel que eth0, eth1, etc. Nous pouvons afficher les informations sur l'interface réseau dans le système actuel via la commande ifconfig, comme indiqué ci-dessous :
ifconfig
Sous Linux, la structure d'adresse de socket de l'interface réseau est définie dans <linux/if.h></ code > Dans le fichier d'en-tête, les programmeurs peuvent créer un socket lié à l'interface réseau spécifiée en appelant socket() et bind(). Voici un exemple de code simple : <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>
. Les programmeurs peuvent utiliser socket(), bind(), Listen(), accept(), connect(). et d'autres fonctions pour créer et gérer des sockets. Ce qui suit est un exemple de code de serveur TCP simple qui implémente un simple serveur Echo basé sur un socket : #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; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!