socket编程代码示例
**Socket 编程代码示例**
Socket 是一种用于网络通信的 API,它允许进程在同一个机器或不同的机器之间进行数据交换。Socket 编程是建立在 TCP/IP 协议之上的,提供了一个抽象层,使得开发者可以使用 socket 来实现各种网络应用。
**1. Socket 基础**
###1.1 Socket 类型socket 有两种类型:TCP (面向连接) 和 UDP (无连接)。TCP 是一种可靠的传输协议,它保证数据的完整性和顺序,而 UDP 是一种不可靠的传输协议,它不保证数据的完整性和顺序。
###1.2 Socket APIsocket API 提供了以下函数:
* `socket()`: 创建一个 socket* `bind()`: 绑定 socket 到特定的地址和端口* `listen()`: 开始监听 socket* `accept()`: 接受连接请求* `connect()`: 连接到远程 socket* `send()`: 发送数据* `recv()`: 接收数据* `close()`: 关闭 socket###1.3 Socket 通信流程socket 通信的流程如下:
1. 客户端创建一个 socket,并使用 `connect()` 函数连接到远程服务器。
2.服务器端创建一个 socket,并使用 `bind()` 和 `listen()` 函数绑定和监听 socket。
3. 当客户端发送数据时,服务器端使用 `accept()` 函数接收连接请求,并使用 `recv()` 函数接收数据。
4. 客户端使用 `send()` 函数发送数据给服务器端。
5.服务器端使用 `send()` 函数将数据返回给客户端。
**2. Socket 编程示例**
###2.1 TCP Server
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.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"; // 创建 socket 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); // 绑定 socket if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 开始监听 socket 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("Connection accepted from client... "); // 接收数据 read(new_socket, buffer,1024); printf("%s ", buffer); // 发送数据 send(new_socket, message, strlen(message),0); close(new_socket); } return0; }
###2.2 TCP Client
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT8080int main() { int client_fd; struct sockaddr_in server_address; int addrlen = sizeof(server_address); char buffer[1024] = {0}; char *message = "Hello from client"; // 创建 socket if ((client_fd = socket(AF_INET, SOCK_STREAM,0)) ==0) { perror("socket failed"); exit(EXIT_FAILURE); } server_address.sin_family = AF_INET; server_address.sin_port = htons(PORT); // 连接到远程服务器 if (connect(client_fd, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) { perror("connect failed"); exit(EXIT_FAILURE); } printf("Connected to server... "); // 发送数据 send(client_fd, message, strlen(message),0); // 接收数据 read(client_fd, buffer,1024); printf("%s ", buffer); close(client_fd); return0; }
###2.3 UDP Server
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.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"; // 创建 socket 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); // 绑定 socket 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; }
###2.4 UDP Client
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT8080int main() { int client_fd; struct sockaddr_in server_address; int addrlen = sizeof(server_address); char buffer[1024] = {0}; char *message = "Hello from client"; // 创建 socket if ((client_fd = socket(AF_INET, SOCK_DGRAM,0)) ==0) { perror("socket failed"); exit(EXIT_FAILURE); } server_address.sin_family = AF_INET; server_address.sin_port = htons(PORT); // 连接到远程服务器 sendto(client_fd, message, strlen(message),0, (struct sockaddr *)&server_address, sizeof(server_address)); printf("Connected to server... "); // 接收数据 recvfrom(client_fd, buffer,1024,0, (struct sockaddr *)&server_address, (socklen_t*)&addrlen); printf("%s ", buffer); close(client_fd); return0; }
**3. Socket 编程注意事项**
* socket 通信时,需要考虑网络拥塞和丢包问题。
* socket 通信时,需要考虑数据的完整性和顺序问题。
* socket 通信时,需要考虑安全性问题,如加密和认证等。
**4. Socket 编程应用场景**
* socket 可用于建立远程服务器和客户端之间的通信。
* socket 可用于实现多人在线游戏和聊天室等功能。
* socket 可用于实现文件传输和共享等功能。
总之,socket 是一种非常强大的网络编程工具,它可以帮助开发者建立复杂的网络应用。