一、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
微信掃一掃
支付寶掃一掃