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);
    }
  • 相关阅读:
    caffe源码整个训练过程
    设计模式--工厂模式 caffe_layer注册
    【Oracle】跟踪文件目录(User_Dump_Dest)生成脚本(11g/9i).txt
    【Oracle】修改参数的同时添加注释
    【Oracle】重置参数
    【Oracle】SCOPE=MEMORY|SPFILE|BOTH
    【Oracle】解锁用户
    【Oracle】开、关、删归档日志(archivelog)
    【Oracle】Rman简介
    【Oracle】非RMAN恢复数据文件、控制文件
  • 原文地址:https://www.cnblogs.com/zhangyangrui/p/13254498.html
Copyright © 2011-2022 走看看