【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);
}
原文地址:https://www.cnblogs.com/zhangyangrui/p/13254498.html