c,#include,#include,#include,#include,#include,,int main() {, int server_fd, new_socket;, struct sockaddr_in address;, int addrlen = sizeof(address);,, 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(8080);,, if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))``
在Linux环境下进行网络编程,通常涉及使用套接字(sockets)来建立网络连接和通信,本文将通过一个具体的实例,展示如何在C语言中使用Linux系统调用来实现一个简单的客户端-服务器模型。
环境准备
确保你的Linux系统中安装了GCC编译器,因为我们将使用C语言编写程序,你可以通过以下命令检查GCC是否已安装:
gcc --version
如果没有安装,你可以通过包管理器安装它,例如在Ubuntu上:
sudo apt update sudo apt install build-essential
服务器端代码
服务器端的主要任务是监听特定端口,等待客户端的连接请求,并在连接建立后与客户端进行数据交换,下面是一个简单的TCP服务器示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8080 int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; const char *hello = "Hello from server"; // 创建套接字文件描述符 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"); exit(EXIT_FAILURE); } printf("Server is listening on port %d... ", PORT); // 接受来自客户端的连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } // 读取并响应客户端消息 read(new_socket, buffer, 1024); printf("Message from client: %s ", buffer); send(new_socket, hello, strlen(hello), 0); printf("Hello message sent "); // 关闭套接字 close(new_socket); close(server_fd); return 0; }
客户端代码
客户端的任务是连接到服务器指定的IP地址和端口,发送一条消息,并接收服务器的响应,以下是一个简单的TCP客户端示例:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #define PORT 8080 int main() { struct sockaddr_in serv_addr; int sock = 0; char buffer[1024] = {0}; const char *hello = "Hello from client"; // 创建套接字文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf(" Socket creation error "); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 转换IPv4和IPv6地址从文本到二进制形式 if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) { printf(" Invalid address/ Address not supported "); return -1; } // 连接到服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf(" Connection Failed "); return -1; } // 发送消息到服务器 send(sock, hello, strlen(hello), 0); printf("Hello message sent "); read(sock, buffer, 1024); printf("Message from server: %s ", buffer); // 关闭套接字 close(sock); return 0; }
编译和运行
将上述服务器和客户端代码分别保存为server.c
和client.c
文件,然后使用以下命令编译它们:
gcc server.c -o server gcc client.c -o client
首先运行服务器:
./server
然后在另一个终端窗口中运行客户端:
./client
你应该会看到客户端发送的消息被服务器接收,并且服务器的响应被客户端接收。
相关问答FAQs
Q1: 如果我想让我的服务器能够处理多个客户端怎么办?
A1: 要使服务器能够处理多个客户端,你需要使用多线程或多进程,在Linux中,你可以使用pthread
库来创建线程,每当有新的客户端连接时,你可以创建一个新线程来处理该客户端的请求,而主线程继续监听新的连接请求,这样,你的服务器就可以同时服务多个客户端了。
Q2: 我如何更改服务器监听的端口号?
A2: 要更改服务器监听的端口号,你只需要修改服务器代码中#define PORT 8080
这一行的值,如果你想让服务器监听端口9090,只需将8080
改为9090
即可,确保客户端代码中的端口号也相应地更改为9090
。
小伙伴们,上文介绍了“linux 网络编程 实例”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1313305.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复