用c++分别写出套接字通信的发送和接收程序并具体写出每一行语句的含义及作用
以下是一个简单的C++套接字通信的发送程序示例:
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
std::cerr << "Failed to create socket" << std::endl;
return -1;
}
// 设置服务器地址
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345); // 设置服务器端口号
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置服务器IP地址
// 连接到服务器
if (connect(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
std::cerr << "Failed to connect to server" << std::endl;
return -1;
}
// 发送数据
std::string message = "Hello, Server!";
if (send(sockfd, message.c_str(), message.size(), 0) < 0) {
std::cerr << "Failed to send data" << std::endl;
return -1;
}
// 关闭套接字
close(sockfd);
return 0;
}
每一行语句的含义及作用如下:
#include <iostream>: 包含输入输出流库,用于输出错误信息。#include <sys/socket.h>: 包含套接字相关的库。#include <arpa/inet.h>: 包含地址转换函数库。int sockfd = socket(AF_INET, SOCK_STREAM, 0);: 创建套接字。AF_INET表示使用IPv4协议。SOCK_STREAM表示使用面向连接的TCP套接字。0表示使用默认的协议。
if (sockfd == -1) { ... }: 检查套接字是否创建成功。sockaddr_in serverAddr{};: 创建服务器地址结构体。serverAddr.sin_family = AF_INET;: 设置地址结构体的地址族为IPv4。serverAddr.sin_port = htons(12345);: 设置服务器端口号,使用htons函数将端口号转换为网络字节序。serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");: 设置服务器IP地址,使用inet_addr函数将字符串IP地址转换为网络字节序的32位整数。if (connect(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { ... }: 连接到服务器。connect函数用于建立与服务器的连接。(struct sockaddr*)&serverAddr将服务器地址结构体转换为通用地址结构体。sizeof(serverAddr)获取服务器地址结构体的大小。
std::string message = "Hello, Server!";: 创建要发送的数据。if (send(sockfd, message.c_str(), message.size(), 0) < 0) { ... }: 发送数据。send函数发送数据到已连接的套接字。message.c_str()获取字符串的C风格字符数组。message.size()获取字符串的长度。0表示没有特殊的标志位。
close(sockfd);: 关闭套接字。
以下是一个简单的C++套接字通信的接收程序示例:
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
std::cerr << "Failed to create socket" << std::endl;
return -1;
}
// 设置服务器地址
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345); // 设置服务器端口号
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置服务器IP地址
// 绑定套接字到本地地址
if (bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
std::cerr << "Failed to bind socket" << std::endl;
return -1;
}
// 监听连接请求
if (listen(sockfd, 5) < 0) {
std::cerr << "Failed to listen on socket" << std::endl;
return -1;
}
// 接受客户端连接
sockaddr_in clientAddr{};
socklen_t clientAddrLen = sizeof(clientAddr);
int clientSockfd = accept(sockfd, (struct sockaddr*)&clientAddr, &clientAddrLen);
if (clientSockfd < 0) {
std::cerr << "Failed to accept client connection" << std::endl;
return -1;
}
// 接收数据
char buffer[1024] = {0};
int bytesRead = recv(clientSockfd, buffer, sizeof(buffer)-1, 0);
if (bytesRead < 0) {
std::cerr << "Failed to receive data" << std::endl;
return -1;
}
// 输出接收到的数据
std::cout << "Received data from client: " << buffer << std::endl;
// 关闭套接字
close(clientSockfd);
close(sockfd);
return 0;
}
每一行语句的含义及作用如下:
#include <iostream>: 包含输入输出流库,用于输出错误信息。#include <sys/socket.h>: 包含套接字相关的库。#include <arpa/inet.h>: 包含地址转换函数库。int sockfd = socket(AF_INET, SOCK_STREAM, 0);: 创建套接字。if (sockfd == -1) { ... }: 检查套接字是否创建成功。sockaddr_in serverAddr{};: 创建服务器地址结构体。serverAddr.sin_family = AF_INET;: 设置地址结构体的地址族为IPv4。serverAddr.sin_port = htons(12345);: 设置服务器端口号,使用htons函数将端口号转换为网络字节序。serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");: 设置服务器IP地址,使用inet_addr函数将字符串IP地址转换为网络字节序的32位整数。if (bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { ... }: 绑定套接字到本地地址。bind函数将套接字与特定的本地地址和端口绑定。
if (listen(sockfd, 5) < 0) { ... }: 监听连接请求。listen函数将套接字设置为监听模式,并指定最大连接数。
sockaddr_in clientAddr{};: 创建客户端地址结构体。socklen_t clientAddrLen = sizeof(clientAddr);: 获取客户端地址结构体的大小。int clientSockfd = accept(sockfd, (struct sockaddr*)&clientAddr, &clientAddrLen);: 接受客户端连接。accept函数接受客户端连接请求,并返回一个新的套接字用于与客户端通信。
if (clientSockfd < 0) { ... }: 检查是否成功接受客户端连接。char buffer[1024] = {0};: 创建缓冲区用于接收数据。int bytesRead = recv(clientSockfd, buffer, sizeof(buffer)-1, 0);: 接收数据。recv函数从已连接的套接字接收数据。buffer接收数据的缓冲区。sizeof(buffer)-1缓冲区的大小。0表示没有特殊的标志位。
if (bytesRead < 0) { ... }: 检查是否成功接收数据。std::cout << "Received data from client: " << buffer << std::endl;: 输出接收到的数据。close(clientSockfd);: 关闭客户端套接字。close(sockfd);: 关闭服务器套接字。
这些示例只是简单的演示了套接字通信的发送和接收过程,实际的套接字通信涉及到更多的错误处理和异常情况的处理。此外,这些示例使用的是面向连接的TCP套接字。对于使用面向数据报的UDP套接字,需要使用不同的函数和方法
原文地址: https://www.cveoy.top/t/topic/h5eI 著作权归作者所有。请勿转载和采集!