【socket编程】TCP服务器、UDP服务器、本地套接字【C语言代码实现】
发布人:shili8
发布时间:2024-11-16 21:56
阅读次数:0
**Socket 编程**
在计算机网络中,Socket 是一种用于进程间通信的 API。它允许不同进程之间通过网络进行数据交换。Socket 编程是建立在 TCP/IP 协议栈之上的一个应用层协议。
本文将介绍 TCP服务器、UDP服务器和本地套接字的编程实现,使用 C语言作为示例代码。
### TCP服务器TCP (Transmission Control Protocol) 是一种面向连接的传输协议。它保证数据在网络中准确无误地传递给对方。
#### TCP服务器代码
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT8080int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; char *message = "Hello from server"; // 创建 TCP 套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM,0)) ==0) { perror("socket failed"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定套接字 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接 if (listen(server_fd,3) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d... ", PORT); while (1) { // 接收新连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept failed"); exit(EXIT_FAILURE); } printf("New connection from client... "); // 接收数据 read(new_socket, buffer,1024); printf("%s ", buffer); // 发送回复 send(new_socket, message, strlen(message),0); close(new_socket); } return0; }
#### TCP服务器解释1. 创建一个 TCP 套接字使用 `socket()` 函数。
2. 绑定套接字到指定的 IP 地址和端口号使用 `bind()` 函数。
3. 监听连接使用 `listen()` 函数。
4. 接收新连接使用 `accept()` 函数。
5. 接收数据使用 `read()` 函数。
6. 发送回复使用 `send()` 函数。
### UDP服务器UDP (User Datagram Protocol) 是一种无连接的传输协议。它不保证数据在网络中准确无误地传递给对方。
#### UDP服务器代码
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT8080int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; char *message = "Hello from server"; // 创建 UDP 套接字 if ((server_fd = socket(AF_INET, SOCK_DGRAM,0)) ==0) { perror("socket failed"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定套接字 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d... ", PORT); while (1) { // 接收数据 recvfrom(server_fd, buffer,1024,0, (struct sockaddr *)&address, (socklen_t*)&addrlen); printf("%s ", buffer); // 发送回复 sendto(server_fd, message, strlen(message),0, (struct sockaddr *)&address, sizeof(address)); } return0; }
#### UDP服务器解释1. 创建一个 UDP 套接字使用 `socket()` 函数。
2. 绑定套接字到指定的 IP 地址和端口号使用 `bind()` 函数。
3. 接收数据使用 `recvfrom()` 函数。
4. 发送回复使用 `sendto()` 函数。
### 本地套接字本地套接字是指在同一台机器上创建的套接字。它不需要绑定到 IP 地址和端口号。
#### 本地套接字代码
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> int main() { int server_fd, new_socket; char buffer[1024] = {0}; char *message = "Hello from server"; // 创建本地套接字 if ((server_fd = socket(AF_UNIX, SOCK_STREAM,0)) ==0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定本地套接字 struct sockaddr_un address; address.sun_family = AF_UNIX; strcpy(address.sun_path, "/tmp/socket"); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } printf("Server listening on socket... "); while (1) { // 接收数据 new_socket = accept(server_fd, NULL, NULL); if (new_socket < 0) { perror("accept failed"); exit(EXIT_FAILURE); } printf("New connection from client... "); // 接收数据 read(new_socket, buffer,1024); printf("%s ", buffer); // 发送回复 send(new_socket, message, strlen(message),0); close(new_socket); } return0; }
#### 本地套接字解释1. 创建一个本地套接字使用 `socket()` 函数。
2. 绑定本地套接字到指定的路径使用 `bind()` 函数。
3. 接收数据使用 `accept()` 函数。
4. 接收数据使用 `read()` 函数。
5. 发送回复使用 `send()` 函数。
以上是 TCP服务器、UDP服务器和本地套接字的编程实现。这些示例代码可以帮助您理解 Socket 编程的基本概念和 API。