基于C++的Socket通信(遇到的字符串转换及其他问题)

1.inet_addr

我们使用socket进行通信的时候,我们需要指定三个元素:通信域(地址族)、IP地址、端口号。这三个元素由SOCKADDR_IN结构体定义,为了简化编程一般将IP地址设置为INADDR_ANY,如果需要使用特定的IP地址则需要使用inet_addr和inet_ntoa完成字符串和in_addr结构体的互换。in_addr是SOCKADDR_IN成员,其代表IP地址。

sockaddr_in结构 (在WinSock2.h中定义)

struct sockaddr_in {
    short   sin_family;
    u_short sin_port;
    struct  in_addr sin_addr;
    char    sin_zero[8];
}

in_addr结构(在windows下)

typedef struct in_addr
{
    union{
        struct { unsigned char s_b1, s_b2, s_b3, s_b4; } S_un_b;
        struct { unsigned short s_w1, s_w2; } S_un_w;
        unsigned long S_addr;
    }S_un;
}in_addr;

inet_addr()函数作用是将一个IP字符串转化为一个网络字节序的整数值。为什么要进行网络字节序列转换可查看之前记录的内容。

2.inet_ntoa

作用是将一个sin_addr结构体输出成IP字符串。

3.htons

htons是将整型变量从主机字节顺序转变成网络字节顺序。htonl()作用和htons()一样,不过它针对的是32位的(long),而htons针对的是两个字节,16位的(short)。

与htonl()和htons()作用相反的两个函数是:ntohl()和ntohs()。

4.c_str

const char *c_str();返回一个指向正规C字符串的指针常量, 内容与本string串相同。

这是为了与c语言兼容,在c语言中没有string类型。故必须通过C++中string类对象的成员函数c_str(),把string对象转换成c中的字符串样式。注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针。

5.strcpy

char *strcpy(char *strDest, const char *strSrc);其中strDest是目的字符串,strSrc是源字符串。

strcpy能把strSrc的内容复制到strDest中。

注意:为什么还要char * 类型的返回值?是为了实现链式表达式。例如:int length= strlen(strcpy(strDest,"hello world!"));

注意:4、5的函数,可以将字符串转换成字符数组。

6.insert

string &insert(int p0, const char *s);在p0位置插入字符串s

参阅:https://blog.csdn.net/ivnetware/article/details/78756321 inet_addr函数讲解

          https://blog.csdn.net/liusandian/article/details/52232449 strcpy函数实现的几种方式

          https://www.cnblogs.com/wangduo/p/5858949.html  C++中c_str()函数的用法

          https://zhidao.baidu.com/question/577559716.html C++中string类insert函数的用法

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以给你提供一个简单的C++ Socket通信代码示例。以下是一个基于TCP协议的客户端和服务器端的示例代码: 服务器端代码: ```cpp #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> int main() { // 创建socket int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { std::cerr << "Failed to create socket." << std::endl; return -1; } // 准备地址信息 sockaddr_in serverAddress{}; serverAddress.sin_family = AF_INET; serverAddress.sin_addr.s_addr = INADDR_ANY; serverAddress.sin_port = htons(8888); // 绑定socket到指定地址和端口 if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) { std::cerr << "Failed to bind socket." << std::endl; return -1; } // 监听连接请求 if (listen(serverSocket, 3) < 0) { std::cerr << "Failed to listen." << std::endl; return -1; } std::cout << "Waiting for incoming connections..." << std::endl; // 接受连接请求 int clientSocket; sockaddr_in clientAddress{}; socklen_t clientAddressLength = sizeof(clientAddress); clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddress, &clientAddressLength); if (clientSocket < 0) { std::cerr << "Failed to accept connection." << std::endl; return -1; } std::cout << "Client connected." << std::endl; // 接收和发送数据 char buffer[1024] = {0}; std::string message = "Hello from server!"; send(clientSocket, message.c_str(), message.length(), 0); std::cout << "Message sent to client: " << message << std::endl; int bytesRead = read(clientSocket, buffer, 1024); if (bytesRead > 0) { std::cout << "Message received from client: " << buffer << std::endl; } // 关闭socket close(clientSocket); close(serverSocket); return 0; } ``` 客户端代码: ```cpp #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> int main() { // 创建socket int clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == -1) { std::cerr << "Failed to create socket." << std::endl; return -1; } // 准备服务器地址信息 sockaddr_in serverAddress{}; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(8888); // 将IP地址从字符串转换为网络字节序 if (inet_pton(AF_INET, "127.0.0.1", &(serverAddress.sin_addr)) <= 0) { std::cerr << "Invalid address/ Address not supported." << std::endl; return -1; } // 连接到服务器 if (connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) { std::cerr << "Connection failed." << std::endl; return -1; } // 接收和发送数据 char buffer[1024] = {0}; int bytesRead = read(clientSocket, buffer, 1024); if (bytesRead > 0) { std::cout << "Message received from server: " << buffer << std::endl; } std::string message = "Hello from client!"; send(clientSocket, message.c_str(), message.length(), 0); std::cout << "Message sent to server: " << message << std::endl; // 关闭socket close(clientSocket); return 0; } ``` 这个示例展示了一个简单的客户端和服务器端的通信过程。服务器端首先创建一个socket,然后绑定到指定的地址和端口,并开始监听连接请求。当有客户端连接时,服务器端接受连接请求,并发送一条消息给客户端。客户端连接到服务器,并接收服务器发送的消息后,发送一条消息给服务器。最后,两端关闭socket
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值