UDP与TCP的服务端、客户端的建立及注意点

使用UDP

服务端
  • bind : 服务器端需要使用 bind 将套接字绑定到特定的端口和IP地址(通常是 INADDR_ANY),这样它才能接收发送到这个端口的数据包。
  • 不需要 listenaccept: 因为UDP是无连接的协议,服务器不需要监听连接或接受连接。
客户端
  • 不需要 bind: UDP客户端通常不需要显式地绑定端口。系统会自动为客户端选择一个临时端口。
  • 不需要 listenaccept: 因为UDP是无连接的协议,客户端只需要知道服务器的IP地址和端口,然后直接发送数据即可。

使用TCP

服务端
  • bind : 服务器需要使用 bind 将套接字绑定到特定的端口和IP地址,以便接收连接请求。
  • listen : 绑定端口后,服务器需要调用 listen 函数,使套接字进入监听状态,准备接受连接请求。
  • accept : 当有客户端连接请求时,服务器使用 accept 函数接受连接,并创建一个新的套接字用于通信。
客户端
  • connect : TCP客户端不需要显式地绑定端口。客户端调用 connect 函数,系统会自动分配一个端口并连接到服务器的IP地址和端口。
  • 不需要 listenaccept: 客户端只需要建立连接,不需要监听和接受连接。

示例代码

UDP服务器
cpp 复制代码
bool CUdpServer::CreateSocket()
{
    WSADATA wsaData;
    if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
    {
        return false;
    }

    m_Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (INVALID_SOCKET == m_Socket)
    {
        return false;
    }

    sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_port = htons(m_nPort);
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    if (SOCKET_ERROR == bind(m_Socket, (SOCKADDR *)&address, sizeof(address)))
    {
        return false;
    }

    return true;
}

TCP服务器

cpp 复制代码
bool CTcpServer::CreateSocket()
{
    WSADATA wsaData;
    if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
    {
        return false;
    }

    m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == m_Socket)
    {
        return false;
    }

    sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_port = htons(m_nPort);
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    if (SOCKET_ERROR == bind(m_Socket, (SOCKADDR *)&address, sizeof(address)))
    {
        return false;
    }

    if (SOCKET_ERROR == listen(m_Socket, SOMAXCONN))
    {
        return false;
    }

    return true;
}

TCP客户端

cpp 复制代码
bool CTcpClient::CreateSocket()
{
    WSADATA wsaData;
    if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
    {
        return false;
    }

    m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == m_Socket)
    {
        return false;
    }

    sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(m_nPort);
    serverAddress.sin_addr.s_addr = inet_addr(m_ServerIP);

    if (SOCKET_ERROR == connect(m_Socket, (SOCKADDR *)&serverAddress, sizeof(serverAddress)))
    {
        return false;
    }

    return true;
}

总结:

  • UDP : 服务端需要 bind,客户端直接发送和接收即可。
  • TCP : 服务端需要 bindlisten,客户端需要 connect,不需要 bindlisten
相关推荐
Trouvaille ~15 小时前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
JoySSLLian16 小时前
手把手教你安装免费SSL证书(附宝塔/Nginx/Apache配置教程)
网络·人工智能·网络协议·tcp/ip·nginx·apache·ssl
猫头虎16 小时前
如何解决 OpenClaw “Pairing required” 报错:两种官方解决方案详解
网络·windows·网络协议·macos·智能路由器·pip·scipy
云姜.18 小时前
网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
网络·网络协议
!chen18 小时前
LabVIEW TCP Server端工具TCP通信
网络·tcp/ip·labview
郝学胜-神的一滴18 小时前
深入解析C/S模型下的TCP通信流程:从握手到挥手的技术之旅
linux·服务器·c语言·网络·网络协议·tcp/ip
“αβ”19 小时前
数据链路层协议 -- 以太网协议与ARP协议
服务器·网络·网络协议·以太网·数据链路层·arp·mac地址
释怀不想释怀19 小时前
Linux网络基础(ip,域名)
linux·网络·tcp/ip
青春给了代码19 小时前
基于WebSocket实现在线语音(实时+保存)+文字双向传输完整实现
网络·websocket·网络协议
北京耐用通信19 小时前
破解AGV多协议互联难题:耐达讯自动化Profinet转Devicenet网关如何实现高效协同
人工智能·科技·物联网·网络协议·自动化·信息与通信