zoukankan      html  css  js  c++  java
  • 【C++】TCP/UDP连接建立

    //////////////////////////////////////////////////////////
    // TCPClient.cpp文件
    
    #include <stdio.h>
    #include "InitSock.h"
    CInitSock initSock;        // 初始化Winsock库
    #include <WS2tcpip.h>
    int main()
    {
        // 创建套节字
        SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (s == INVALID_SOCKET)
        {
            printf(" Failed socket() 
    ");
            return 0;
        }
    
        // 也可以在这里调用bind函数绑定一个本地地址
        // 否则系统将会自动安排
    
        // 填写远程地址信息
        sockaddr_in servAddr;
        servAddr.sin_family = AF_INET;
        servAddr.sin_port = htons(4567);
        // 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
        // 如果你的计算机没有联网,直接使用127.0.0.1即可
        const char src[] = "127.0.0.1";
        in_addr st;
        inet_pton(AF_INET, src,(void*)&st);
        
        servAddr.sin_addr= st;
    
        if (::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
        {
            printf(" Failed connect() 
    ");
            return 0;
        }
        while (true) {
            // 接收数据
            char buff[256];
            int nRecv = ::recv(s, buff, 256, 0);
            if (nRecv > 0)
            {
                buff[nRecv] = '';
                printf(" 接收到数据:%s", buff);
            }
        }
        // 关闭套节字
        ::closesocket(s);
        return 0;
    }
    // TCPServer.cpp文件
    
    #include <WS2tcpip.h>
    #include "InitSock.h"
    #include <stdio.h>
    #include <iostream>
    CInitSock initSock;        // 初始化Winsock库
    
    int main()
    {
        // 创建套节字
        SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sListen == INVALID_SOCKET)
        {
            printf("Failed socket() 
    ");
            return 0;
        }
    
        // 填充sockaddr_in结构
        sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(4567);
        sin.sin_addr.S_un.S_addr = INADDR_ANY;
    
        // 绑定这个套节字到一个本地地址
        if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
        {
            printf("Failed bind() 
    ");
            return 0;
        }
    
        // 进入监听模式
        if (::listen(sListen, 2) == SOCKET_ERROR)
        {
            printf("Failed listen() 
    ");
            return 0;
        }
    
        // 循环接受客户的连接请求
        sockaddr_in remoteAddr;
        int nAddrLen = sizeof(remoteAddr);
        SOCKET sClient;
        char szText[] = " TCP Server Demo! 
    ";
        while (TRUE)
        {
            // 接受一个新连接
            sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
            if (sClient == INVALID_SOCKET)
            {
                printf("Failed accept()");
                continue;
            }
            char IPdotdec[20]; 
            inet_ntop(AF_INET, (void*)&(remoteAddr.sin_addr), IPdotdec,15);
            printf(" 接受到一个连接:%s 
    ", IPdotdec);
            while (true) {
                char szText[100];
                std::cin >> szText;
                ::send(sClient, szText, strlen(szText), 0);
    
            }
    
            ::closesocket(sClient);
        }
    
        // 关闭监听套节字
        ::closesocket(sListen);
    
        return 0;
    }
    //////////////////////////////////////////////////////////
    // UDPClient文件
    
    
    #include "InitSock.h"
    #include <stdio.h>
    CInitSock initSock;        // 初始化Winsock库
    
    int main()
    {
        // 创建套节字
        SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (s == INVALID_SOCKET)
        {
            printf("Failed socket() %d 
    ", ::WSAGetLastError());
            return 0;
        }
    
        // 也可以在这里调用bind函数绑定一个本地地址
        // 否则系统将会自动安排
    
        // 填写远程地址信息
        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(4567);
        // 注意,这里要填写服务器程序所在机器的IP地址
        // 如果你的计算机没有联网,直接使用127.0.0.1即可
        char IPdotdec[] = "127.0.0.1";
        inet_pton(AF_INET, IPdotdec, (void*)&(addr.sin_addr));
    
        // 发送数据
        char szText[100];
        while (true) {
            cin >> szText;
            ::sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
        }
    
        ::closesocket(s);
        return 0;
    }
    //////////////////////////////////////////////////////////
    // UDPServer.cpp文件
    
    
    #include "InitSock.h"
    #include <stdio.h>
    CInitSock initSock;        // 初始化Winsock库
    
    int main()
    {
        // 创建套节字
        SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (s == INVALID_SOCKET)
        {
            printf("Failed socket() 
    ");
            return 0;
        }
    
        // 填充sockaddr_in结构
        sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(4567);
        sin.sin_addr.S_un.S_addr = INADDR_ANY;
    
        // 绑定这个套节字到一个本地地址
        if (::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
        {
            printf("Failed bind() 
    ");
            return 0;
        }
    
        // 接收数据
        char buff[1024];
        sockaddr_in addr;
        int nLen = sizeof(addr);
        while (TRUE)
        {
            int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen);
            char IPdotdec[20];
            inet_ntop(AF_INET,  (void*)&(addr.sin_addr), IPdotdec,16);
            if (nRecv > 0)
            {
                buff[nRecv] = '';
                printf(" 接收到数据(%s):%s", IPdotdec, buff);
            }
            else
                break;
        }
        ::closesocket(s);
    }
  • 相关阅读:
    IIS发布问题解决
    创建Core项目使用IdentityServer4
    通过数据库名称字符串 反射获取数据并刷新对应缓存
    MVC模式下unity配置,报错“No connection string named '**Context' could be found in the application config file”
    Docker巨轮的航行之路-基础知识篇
    C#之LINQ
    Js调试中不得不知的Console
    jQuery中是事件绑定方式--on、bind、live、delegate
    前端常用技术概述--Less、typescript与webpack
    ES6学习之变量的解构赋值
  • 原文地址:https://www.cnblogs.com/zhangyangrui/p/13254498.html
Copyright © 2011-2022 走看看