当前位置:   article > 正文

UDP与TCP的服务端、客户端的建立及注意点_udp客户端需要create吗

udp客户端需要create吗

使用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服务器
  1. bool CUdpServer::CreateSocket()
  2. {
  3. WSADATA wsaData;
  4. if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
  5. {
  6. return false;
  7. }
  8. m_Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  9. if (INVALID_SOCKET == m_Socket)
  10. {
  11. return false;
  12. }
  13. sockaddr_in address;
  14. address.sin_family = AF_INET;
  15. address.sin_port = htons(m_nPort);
  16. address.sin_addr.s_addr = htonl(INADDR_ANY);
  17. if (SOCKET_ERROR == bind(m_Socket, (SOCKADDR *)&address, sizeof(address)))
  18. {
  19. return false;
  20. }
  21. return true;
  22. }

TCP服务器

  1. bool CTcpServer::CreateSocket()
  2. {
  3. WSADATA wsaData;
  4. if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
  5. {
  6. return false;
  7. }
  8. m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  9. if (INVALID_SOCKET == m_Socket)
  10. {
  11. return false;
  12. }
  13. sockaddr_in address;
  14. address.sin_family = AF_INET;
  15. address.sin_port = htons(m_nPort);
  16. address.sin_addr.s_addr = htonl(INADDR_ANY);
  17. if (SOCKET_ERROR == bind(m_Socket, (SOCKADDR *)&address, sizeof(address)))
  18. {
  19. return false;
  20. }
  21. if (SOCKET_ERROR == listen(m_Socket, SOMAXCONN))
  22. {
  23. return false;
  24. }
  25. return true;
  26. }

TCP客户端

  1. bool CTcpClient::CreateSocket()
  2. {
  3. WSADATA wsaData;
  4. if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
  5. {
  6. return false;
  7. }
  8. m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  9. if (INVALID_SOCKET == m_Socket)
  10. {
  11. return false;
  12. }
  13. sockaddr_in serverAddress;
  14. serverAddress.sin_family = AF_INET;
  15. serverAddress.sin_port = htons(m_nPort);
  16. serverAddress.sin_addr.s_addr = inet_addr(m_ServerIP);
  17. if (SOCKET_ERROR == connect(m_Socket, (SOCKADDR *)&serverAddress, sizeof(serverAddress)))
  18. {
  19. return false;
  20. }
  21. return true;
  22. }

总结:

  • UDP: 服务端需要 bind,客户端直接发送和接收即可。
  • TCP: 服务端需要 bindlisten,客户端需要 connect,不需要 bindlisten
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/988076
推荐阅读
相关标签
  

闽ICP备14008679号