一、Socket簡介
Socket是網絡通信中的一種機制,它是一組接口和方法的集合,用於實現客戶機與服務器之間的數據傳輸。
Socket本身並不是協議,而是編程接口,它使用TCP或UDP協議是最常見的方法。Socket編程實現了在不同計算機之間的數據傳輸。
在C語言中,Socket通常有以下兩種類型:
- Stream Socket(流式Socket):基於TCP協議的Socket,用於面向連接的網絡通信。
- Datagram Socket(數據報式Socket):基於UDP協議的Socket,用於面向無連接的網絡通信。
二、使用流式Socket進行通信
以下是一個簡單的使用Stream Socket進行通信的例子:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) perror("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = 5001; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) perror("ERROR on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) perror("ERROR on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) perror("ERROR reading from socket"); printf("Here is the message: %s\n",buffer); n = write(newsockfd,"I got your message",18); if (n < 0) perror("ERROR writing to socket"); return 0; }
該例子中創建了一個服務器端程序,通過監聽端口5001,來接受來自客戶端的請求。當有請求發生時,會接受並返回一個簡單的信息。
三、使用數據報式Socket進行通信
以下是一個簡單的使用Datagram Socket進行通信的例子:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main() { int sockfd; struct sockaddr_in servaddr, cliaddr; char buffer[1024]; sockfd = socket(AF_INET, SOCK_DGRAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(1256); bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); int len, n; len = sizeof(cliaddr); while(1) { n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cliaddr, &len); buffer[n] = '\0'; printf("Received: %s\n", buffer); sendto(sockfd, "Hi there!", 10, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); } return 0; }
該例子中創建一個UDP服務器端程序,監聽端口1256。當有客戶端向該端口發送數據報時,服務器端會處理客戶端的請求並返回”Hi there!”的信息。
四、使用Socket實現多客戶端連接
以下是一個使用Socket實現多客戶端連接的例子:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n, pid; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) perror("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = 5001; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) perror("ERROR on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); while(1) { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) perror("ERROR on accept"); pid = fork(); if (pid < 0) perror("ERROR on fork"); if (pid == 0) { close(sockfd); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) perror("ERROR reading from socket"); printf("Here is the message: %s\n",buffer); n = write(newsockfd,"I got your message",18); if (n < 0) perror("ERROR writing to socket"); exit(0); } else close(newsockfd); } close(sockfd); return 0; }
該例子實現了一個多客戶端連接的服務器端程序。當有新的客戶端請求時,服務器端會創建一個子進程來處理該請求,從而實現多客戶端連接的功能。
原創文章,作者:UUEXA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/334813.html