• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > EDA/PCB > 設計應用 > 基于C++中的IPv6網絡程序設計

    基于C++中的IPv6網絡程序設計

    作者: 時間:2012-09-12 來源:網絡 收藏

    五、程序實例

    在這里,給出一個基于IPV6的簡單回應(ECHO)服務器程序.

    1.建立C

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

    #define WIN32_LEAN_AND_MEAN

    #include

    #include

    #include // 頭文件

    #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);

    break;

    }

    }

    return 0;

    }

    void CIPv6::Usage(char *ProgName)

    {

    fprintf(stderr, nSimple socket sample server program.n);

    fprintf(stderr, transport tEither TCP or UDP. (default: %s)n,

    TCP);

    fprintf(stderr, portttPort on which to bind. (default %s)n,

    DEFAULT_PORT);

    fprintf(stderr, addresstIP address on which to bind.(default: unspecified address)n);

    WSACleanup();

    exit(1);

    }

    LPSTR CIPv6::DecodeError(int ErrorCode)

    {

    static char Message[1024];

    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |

    FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, ErrorCode,

    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

    (LPSTR)Message, 1024, NULL);

    return Message;

    }

    2.應用示例

    #include stdafx.h

    #include IPv6.h

    int main(int argc, char* argv[])

    {

    CIPv6 m_ipv6;

    m_ipv6.CreateServer(); //采用默認創建服務器,

    //如果你成功安裝了IPv6可以使用正常使用

    return 0;

    }


    上一頁 1 2 3 4 下一頁

    關鍵詞: IPv6 網絡 程序設計

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 华亭县| 澜沧| 桦南县| 宁蒗| 洪江市| 绵竹市| 温宿县| 沙洋县| 荆门市| 洪湖市| 宝鸡市| 铁力市| 普兰店市| 衡南县| 长沙市| 兴国县| 襄汾县| 正镶白旗| 林芝县| 炉霍县| 肇州县| 南岸区| 泽普县| 屯留县| 铅山县| 神农架林区| 沙河市| 大洼县| 扬州市| 乐安县| 邮箱| 通化县| 南木林县| 五河县| 庆云县| 嘉义市| 昌乐县| 玉溪市| 宜兰县| 龙江县| 临江市|