Socket 编程是一种通过网络进行通信的机制。它允许程序在不同的计算机之间发送和接收数据。
在 linux 下,Socket 编程使用 C 语言的 Berkeley 套接字 API。本教程将引导您完成在 Linux 下使用 Socket 编程的基本步骤。
要创建 Socket,需要调用
socket()
函数。该函数需要三个参数:
domain
:指定要使用的协议族,通常为
AF_INET
(IPv4)或
AF_INET6
(IPv6)。
type
:指定套接字类型,通常为
SOCK_STREAM
(用于 TCP 连接)或
SOCK_DGRAM
(用于 UDP 连接)。
include int socket(int domain, int type, int protocol);
在创建 Socket 后,需要将其绑定到一个网络地址。这可以通过调用
bind()
函数来完成。该函数需要两个参数:
socket_fd
:要绑定的套接字的文件描述符。
addr
:指向网络地址的指针。
include int bind(int socket_fd, struct sockaddr addr, socklen_t addrlen);
如果要创建服务器套接字,需要调用
listen()
函数来监听传入的连接。该函数需要两个参数:
socket_fd
:要监听的套接字的文件描述符。
backlog
:允许排队的最大待处理连接数。
include int listen(int socket_fd, int backlog);
当一个客户端连接到服务器时,服务器可以使用
accept()
函数来接受连接。该函数需要两个参数:
socket_fd
:要监听的套接字的文件描述符。
addr
:指向客户端地址的指针。
include int accept(int socket_fd, struct sockaddr addr, socklen_t addrlen);
要发送数据,可以使用
send()
函数。该函数需要三个参数:
socket_fd
:要发送数据的套接字的文件描述符。
buf
:指向要发送的数据的缓冲区的指针。
len
:要发送的数据的长度。
include ssize_t send(int socket_fd, const void buf, size_t len, int flags);
要接收数据,可以使用
recv()
函数。该函数需要三个参数:
socket_fd
:要接收数据的套接字的文件描述符。
buf
:指向要接收数据的缓冲区的指针。
len
:要接收的最大数据量。
include ssize_t recv(int socket_fd, void buf, size_t len, int flags);
当不再需要 Socket 时,可以使用
close()
函数来关闭它。该函数需要一个参数:
socket_fd
:要关闭的套接字的文件描述符。
include int close(int socket_fd);
以下是一个简单的示例,演示了如何在 Linux 下使用 Socket 进行客户端-服务器通信:
// 服务器端
include
include int main() {// 创建 Socketint server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == -1) {perror("socket()");exit(EXIT_FAILURE);}// 绑定 Socketstruct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8080);if (bind(server_fd, (struct sockaddr )&server_addr, sizeof(server_addr)) == -1) {perror("bind()");exit(EXIT_FAILURE);}// 监听 Socketif (listen(server_fd, 5) == -1) {perror("listen()");exit(EXIT_FAILURE);}// 接受连接struct sockaddr_in client_addr;socklen_t client_addr_len = sizeof(client_addr);int client_fd = accept(server_fd, (struct sockaddr )&client_addr, &client_addr_len);if (client_fd == -1) {perror("accept()");exit(EXIT_FAILURE);}// 发送数据const char message = "Hello from server!";if (send(client_fd, message,strlen(message), 0) == -1) {perror("send()");exit(EXIT_FAILURE);}// 关闭 Socketclose(client_fd);close(server_fd);return 0;
}// 客户端端
include
include int main() {// 创建 Socketint client_fd = socket(AF_INET, SOCK_STREAM, 0);if (client_fd == -1) {perror("socket()");exit(EXIT_FAILURE);}// 连接到服务器struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");server_addr.sin_port = htons(8080);if (connect(client_fd, (struct sockaddr )&server_addr, sizeof(server_addr)) == -1) {perror("connect()");exit(EXIT_FAILURE);}// 接收数据char buffer[1024];if (recv(client_fd, buffer, sizeof(buffer), 0) == -1) {perror("recv()");exit(EXIT_FAILURE);}// 打印接收到的数据printf("Received message: %s\n", buffer);// 关闭 Socketclose(client_fd);return 0;
}
要查看计算机的 IP 地址,可以使用以下命令:
ifconfig
ip addr
这些命令将列出计算机的所有网络接口及其对应的 IP 地址。
本文地址:https://www.qianwe.com/article/58d9ac8384d2a103eb4f.html