C++基于Socket的网络编程IPv6

服务端代码:server.cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

using namespace std;

int main(int argc, char *argv[]) {
    if(argc != 2) {
        cerr << "Usage: ./server <port>" << endl;
        return -1;
    }

    int sockfd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);

    if(sockfd == -1) {
        cerr << "Failed to create socket!" << endl;
        return -1;
    }

    struct addrinfo hints;
    struct addrinfo *res;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET6;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    int ret = getaddrinfo(NULL, argv[1], &hints, &res);

    if(ret != 0) {
        cerr << "getaddrinfo failed: " << gai_strerror(ret) << endl;
        return -1;
    }

    if(bind(sockfd, res->ai_addr, res->ai_addrlen) == -1) {
        cerr << "Failed to bind!" << endl;
        return -1;
    }

    if(listen(sockfd, SOMAXCONN) == -1) {
        cerr << "Failed to listen!" << endl;
        return -1;
    }

    cout << "Waiting for connection..." << endl;

    struct sockaddr_storage client_addr;
    socklen_t client_addr_len = sizeof(client_addr);

    int newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);

    if(newsockfd == -1) {
        cerr << "Failed to accept!" << endl;
        return -1;
    }

    char client_ip[INET6_ADDRSTRLEN];

    inet_ntop(client_addr.ss_family, &(((struct sockaddr_in6 *)&client_addr)->sin6_addr), client_ip, sizeof(client_ip));

    cout << "Connected with " << client_ip << endl;

    char buffer[1024];

    while(true) {
        memset(buffer, 0, sizeof(buffer));
        recv(newsockfd, buffer, sizeof(buffer), 0);

        if(strlen(buffer) > 0) {
            cout << "Client: " << buffer << endl;
        }

        if(strcmp(buffer, "exit") == 0) {
            break;
        }

        cout << "Enter message: ";
        cin.getline(buffer, 1024);

        if(strlen(buffer) == 0) {
            continue;
        }

        send(newsockfd, buffer, strlen(buffer), 0);
    }

    close(newsockfd);
    close(sockfd);

    return 0;
}


客户端代码:client.cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

using namespace std;

int main(int argc, char *argv[]) {
    if(argc != 3) {
        cerr << "Usage: ./client <server-ip> <port>" << endl;
        return -1;
    }

    int sockfd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);

    if(sockfd == -1) {
        cerr << "Failed to create socket!" << endl;
        return -1;
    }

    struct addrinfo hints;
    struct addrinfo *res;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET6;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    int ret = getaddrinfo(argv[1], argv[2], &hints, &res);

    if(ret != 0) {
        cerr << "getaddrinfo failed: " << gai_strerror(ret) << endl;
        return -1;
    }

    if(connect(sockfd, res->ai_addr, res->ai_addrlen) == -1) {
        cerr << "Failed to connect!" << endl;
        return -1;
    }

    cout << "Connected!" << endl;

    char buffer[1024];

    while(true) {
        cout << "Enter message: ";
        cin.getline(buffer, 1024);

        if(strlen(buffer) == 0) {
            continue;
        }

        send(sockfd, buffer, strlen(buffer), 0);

        if(strcmp(buffer, "exit") == 0) {
            break;
        }

        memset(buffer, 0, sizeof(buffer));
        recv(sockfd, buffer, sizeof(buffer), 0);

        if(strlen(buffer) > 0) {
            cout << "Server: " << buffer << endl;
        }
    }

    close(sockfd);

    return 0;
}

g++编译出两个可执行文件之后
g++ -g -o server server.cpp
g++ -g -o client client.cpp

客户端执行./server 7777
服务端执行./client fe80:0:0:0:20c:29ff:fe17:d208%ens33 7777

查看服务端是否监听端口
netstat -anp | grep 7777

服务端截图
1
客户端截图
2

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于Socket的TCP网络编程IPv6是一种使用IPv6协议进行网络编程的方法。在这种编程中,可以使用套接字(socket)函数来创建和管理与网络通信相关的套接字。在IPv6中,套接字函数的参数和使用方法与IPv4略有不同,需要使用IPv6的地址结构。引用展示了一个使用C语言编写的简单的IPv6 Socket程序的示例代码。 在这个示例代码中,首先使用getaddrinfo函数获取与指定主机名或IP地址相关的地址信息。然后,遍历获取到的地址信息列表,使用inet_ntop函数将IPv6地址转换为可读的字符串格式,并打印出来。最后,释放地址信息占用的内存。 需要注意的是,上述示例代码只是一个简单的展示,实际的IPv6 Socket编程可能涉及更多的功能和细节,例如创建套接字、绑定地址、监听连接请求、接受和发送数据等。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [C++基于Socket的TCP网络编程IPv6](https://download.csdn.net/download/qq_40155090/12430319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [getaddrinfo函数使用](https://blog.csdn.net/chinabhlt/article/details/47251929)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴草帽的大z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值