您当前的位置:五五电子网电子知识单片机-工控设备源码-程序基于C++中的IPv6网络程序设计分析 正文
基于C++中的IPv6网络程序设计分析

基于C++中的IPv6网络程序设计分析

点击数:7168 次   录入时间:03-04 12:02:19   整理:http://www.55dianzi.com   源码-程序

    hints.ai_protocol=IPPROTO_TCP;

    hints.ai_flags=AI_PASSIVE;

    rc=getaddinfo(NULL,szPort,&hints,&res);

    if(rc!=0){//失败处理;}

    ptr=res;

    2. 用返回的addrinfo结构中的ai_family,ai_socketype,ai_protocol字段来创建套接字后;便可以使用addrinfo结构中的ai_addr 和ar_addrlen 字段调用绑定函数bind()。

    while(ptr)

    {

    socklisten[i]=socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol);

    if(socklisten[i]==INVALID_SOCKET){//创建失败处理;}

    rc=bind(socklisten[i],ptr->ai_addr,ptr->ai_addrlen);

    if(rc==SOCKET_Error){//绑定失败处理}

    rc=listen(slisten[i],7)//开始*

    if(rc==SOCKET_ERROR){//*失败处理}

    i++;

    ptr=ptr->ai_next;

    }

    。。。

    //完成其他编程

   



www.55dianzi.com

    五、程序实例

    在这里,给出一个基于IPV6的简单回应(ECHO)服务器程序.

    1.建立CIPv6 类

    // IPv6.h: 头文件,这里使用到了套接字中的“select I/O模型”

    #define WIN32_LEAN_AND_MEAN

    #include

    #include

    #include // IPv6 头文件

    #include

    #include

    #include

    #pragma comment(lib, "ws2_32.lib")//套接字库文件

    #define DEFAULT_PORT "7274" // 默认端口

    #define BUFFER_SIZE 64 // 数据缓冲区

    class CIPv6

    {

    publIC:

    // 创建TCP 服务器

    int CreateServer(char *Port = DEFAULT_PORT,char *Address = NULL);

    void Usage(char *ProgName);//用户信息提示

    LPSTR DecodeError(int ErrorCode);//获取错误信息

    CIPv6();

    virtual ~CIPv6();

    };

    // IPv61.cpp: CIPv6类的实现 .

    // IPv61.cpp: implementation of the CIPv6 class.

    //

    //////////////////////////////////////////////////////////////////////

    #include "stdafx.h"

    #include "IPv61.h"

    int CIPv6::CreateServer(char *Port, char *Address)

    {

    char Buffer[BUFFER_SIZE], Hostname[NI_MAXHOST];

    int RetVal, FromLen, AmountRead;

    SOCKADDR_STORAGE From;

    WSADATA wsaData;

    ADDRINFO Hints, *AddrInfo;

    SOCKET ServSock;

    fd_set SockSet;

    // 启动Winsock

    if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)

    {

    FPrintf(stderr, "WSAStartup faiLED with error %d: %sn",

    RetVal, DecodeError(RetVal));

    WSACleanup();

    return -1;

    }

    if (Port == NULL)

    {

    Usage("Port Error");

    }

    MEMSet(&Hints, 0, sizeof(Hints));

    Hints.ai_family =AF_INET6;// Family;

    Hints.ai_socktype =SOCK_STREAM;

    Hints.ai_flags = AI_NUMERICHOST | AI_PASSIVE;

    RetVal = getaddrinfo(Address, Port, &Hints, &AddrInfo);

    if (RetVal != 0)

    {

    fprintf(stderr, "getaddrinfo failed with error %d: %sn", RetVal, gai_strerror(RetVal));

    WSACleanup();

    return -1;

    }

    // 创建套接字

    ServSock = socket(AddrInfo->ai_family,AddrInfo->ai_socktype, AddrInfo->ai_protocol);

    if (ServSock == INVALID_SOCKET)

    {

    fprintf(stderr, "socket() failed with error %d: %sn",

    WSAGetLastError(), DecodeError(WSAGetLastError()));

    WSACleanup();

    return -1;

    }

    // 绑定套接字

    if (bind(ServSock, AddrInfo->ai_addr, AddrInfo->ai_addrlen) == SOCKET_ERROR)

    {

    fprintf(stderr,"bind() failed with error %d: %sn",

    WSAGetLastError(), DecodeError(WSAGetLastError()));

    WSACleanup();

    return -1;

    }

    // 侦听

    if (listen(ServSock, 5) == SOCKET_ERROR)

    {

    fprintf(stderr, "listen() failed with error %d: %sn",

    WSAGetLastError(), DecodeError(WSAGetLastError()));

    WSACleanup();

    return -1;

    }

    printf("'Listening' on port %s, protocol %s, protocol family %sn",

    Port, "TCP",

    "PF_INET6");

    freeaddrinfo(AddrInfo);

    //使用select I/O 模型进行收发

    FD_ZERO(&SockSet);

    while(1)

    {

    FromLen = sizeof(From);

    if (FD_ISSET(ServSock, &SockSet)) break;

    FD_SET(ServSock, &SockSet);

    if (select(0, &SockSet, 0, 0, 0) == SOCKET_ERROR)

    {

    fprintf(stderr, "select() failed with error %d: %sn",

    WSAGetLastError(), DecodeError(WSAGetLastError()));

    WSACleanup();

    return -1;

    }

    }

    if (FD_ISSET(ServSock, &SockSet))

    {

    FD_CLR(ServSock, &SockSet);

    }

    //接受一个连接

    SOCKET ConnSock;

    ConnSock = aCCept(ServSock, (LPSOCKADDR)&From, &FromLen);

    if (ConnSock == INVALID_SOCKET)

    {

    fprintf(stderr, "accept() failed with error %d: %sn",

    WSAGetLastError(), DecodeError(WSAGetLastError()));

    WSACleanup();

    return -1;

    }

    if (getnameinfo((LPSOCKADDR)&From, FromLen, Hostname,

    sizeof(Hostname), NULL, 0, NI_NUMERICHOST) != 0)

    strcpy(Hostname, "");

    printf("nAccepted connection from %sn", Hostname);

    while(1)

    {

    //等待接受数据

    AmountRead = recv(ConnSock, Buffer, sizeof(Buffer), 0);

    if (AmountRead == SOCKET_ERROR)

    {

    fprintf(stderr, "recv() failed with error %d: %sn", WSAGetLastError(), DecodeError(WSAGetLastError()));

    closesocket(ConnSock);

    break;

    }

    if (AmountRead == 0) {

    printf("Client closed connectionn");

    closesocket(ConnSock);

    break;

    }

    printf("Received %d bytes from client: [%.*s]n",

    AmountRead, AmountRead, Buffer);

    //进行简单ECHO 回应

    printf("Echoing same data back to clientn");

    RetVal = send(ConnSock, Buffer, AmountRead, 0);

    if (RetVal == SOCKET_ERROR)

    {

    fprintf(stderr, "send() failed: error %d: %sn",

    WSAGetLastError(), DecodeError(WSAGetLastError()));

    closesocket(ConnSock);

上一页  [1] [2] [3]  下一页


本文关键字:程序设计  网络  源码-程序单片机-工控设备 - 源码-程序