大家好,非常荣幸能和大家一起分享知识,今天我将和大家一起编写一个关于网络通信的实战小项目.在我的网络通信专栏中已经将网络通信的工作原理以及用到的所有需要了解的函数都一一进行了详细的讲解,今天的项目我将不再细致的阐述每个函数的功能及用法,如有不明白的地方,可以查看我的专栏或者直接评论区交流.好了废话不多说,直接上代码:
首先我先和大家一起捋一下服务器端的实现流程:
(1)定义端口号和IP地址;
(2)使用socket函数创建套接字;
(3)使用bind函数绑定套接字和IP地址,端口号;
(4)使用listen函数监听连接服务器端口号的客户端;
(5)使用accept函数接受客户端的链连接请求.
sever.cpp
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<stdlib.h>
#define PORT 8080 //d定义端口号
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char hello[] = "Hello from server!";
// 创建套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 绑定套接字到端口8080
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 is listening on port %d...\n", PORT);
// 接受客户端连接请求并发送消息
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
send(new_socket, hello, strlen(hello), 0);
printf("Message sent to client: %s\n", hello);
// 接收客户端消息并回复
while (recv(new_socket, buffer, 1024, 0) > 0) {
printf("Client message: %s\n", buffer);
send(new_socket, buffer, strlen(buffer), 0);
printf("Message sent to client: %s\n", buffer);
}
close(new_socket);
close(server_fd);
return 0;
}
客户端的实现流程:
(1)定义服务器的端口号和IP地址;
(2)使用socket函数创建套接字;
(3)使用connect函数连接服务器;
(4)发送数据
client.cpp
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SERVER_IP "127.0.0.1" // 服务器的IP地址
#define SERVER_PORT 8080 // 服务器的端口号
#define BUFFER_SIZE 1024 // 接收消息的缓冲区大小
int main() {
int sock = 0;
struct sockaddr_in serv_addr; // 服务器地址结构体
char message[] = "Hello from client!"; // 要发送的消息
char buffer[BUFFER_SIZE] = {0}; // 用于存储接收到的消息的缓冲区
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Socket creation error\n";
return -1;
}
// 设置服务器地址结构体
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVER_PORT);
// 将IP地址从点分十进制转换为二进制形式
if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0) {
std::cerr << "Invalid address / Address not supported\n";
return -1;
}
// 连接到服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
std::cerr << "Connection failed\n";
return -1;
}
std::cout << "Connected to server\n";
// 发送消息给服务器
if (send(sock, message, strlen(message), 0) < 0) {
std::cerr << "Send failed\n";
return -1;
}
std::cout << "Message sent to server: " << message << std::endl;
// 接收服务器的响应
int valread = read(sock, buffer, BUFFER_SIZE);
if (valread == -1) {
std::cerr << "Receive failed\n";
return -1;
}
std::cout << "Message received from server: " << buffer << std::endl;
// 关闭套接字
close(sock);
return 0;
}
编写完程序后,我们需要在linux系统下打开两个终端,一个作为客户端,另一个作为服务端.
在服务端依次输入如下代码:
(1):cd到代码所在文件路径
cd /home/zhouweiqing/14/src
(2):编译服务器程序,命名为sever_out
g++ -o sever_out sever.cpp
(3):运行sever_out执行文件
./sever_out
在客户端依次输入如下代码:
?(1):cd到代码所在文件路径
cd /home/zhouweiqing/14/src
(2):编译服务器程序,命名为client_out
g++ -o client_out client.cpp
(3):运行client_out执行文件
./client_out
得到结果如图所示:
/home/zhouweiqing/图片/2024-01-02 13-46-05 的屏幕截图.png
/home/zhouweiqing/图片/2024-01-02 13-46-15 的屏幕截图.png
可以看到客户端成功连接了端口号为8080的服务端,并互相进行了通信! 大功告成!