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


原文地址: https://www.cveoy.top/t/topic/pN6b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录