QT中UDPSocket丢包问题(续)

时间:2025-03-29 10:38:59
  •     /************* socket **************/  
  • #if _QT_SOCKET_     
  •     p_echo_socket = new QUdpSocket(this);  
  •     p_echo_socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 4*1024*1024);//设置缓存  
  •     if(!p_echo_socket->bind(DRY_ECHO_NET_PORT))  // 端口绑定  
  •     {  
  •         qDebug()<<"BIND failed for receiving echo port.";  
  •     }  
  • #endif  
  •   
  • #if _WIN_SOCKET_  // for windows OS  
  •     sockVersion = MAKEWORD(2,2);  
  •     if(WSAStartup(sockVersion, &wsaData) != 0)  
  •     {  
  •         printf("winsock initialization FAILED.");  
  •     }  
  •     echo_socket_WIN = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
  •     if(echo_socket_WIN == INVALID_SOCKET)  
  •     {  
  •         printf("winsocket error !");  
  •     }  
  •     addr_WIN.sin_family = AF_INET;  
  •     addr_WIN.sin_port = htons(DRY_ECHO_NET_PORT);  
  •     addr_WIN.sin_addr.S_un.S_addr = INADDR_ANY;  
  •     if(bind(echo_socket_WIN, (sockaddr *)&addr_WIN, sizeof(addr_WIN)) == SOCKET_ERROR)  
  •     {  
  •         printf("bind error !");  
  •         closesocket(echo_socket_WIN);  
  •     }  
  •     // set socket buffer size  
  •     int optVal = 0;  
  •     int optLen = sizeof(optVal);  
  •     optVal = 4*1024*1024;  
  •     setsockopt(echo_socket_WIN, SOL_SOCKET, SO_RCVBUF, (char*)&optVal, optLen);  
  • #endif  
  •   
  • #if _LINUX_SOCKET_  
  •     bzero(&echo_socket_LINUX,sizeof(echo_socket_LINUX));  
  •     echo_socket_LINUX.sin_family=AF_INET;  
  •     echo_socket_LINUX.sin_addr.s_addr=htonl(INADDR_ANY);  
  •     echo_socket_LINUX.sin_port=htons(DRY_ECHO_NET_PORT);  
  •     socket_len=sizeof(echo_socket_LINUX);  
  •     socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);  
  •     bind(socket_descriptor,(struct sockaddr *)&echo_socket_LINUX,sizeof(echo_socket_LINUX));  
  •     int buffer_size_LINUX=0;  
  •     socklen_t optlen_LINUX;  
  •     optlen_LINUX = sizeof(buffer_size_LINUX);  
  •     getsockopt(socket_descriptor,SOL_SOCKET,SO_RCVBUF,&buffer_size_LINUX,&optlen_LINUX);  
  •     buffer_size_LINUX = 4*1024*1024;  
  •     if(setsockopt(socket_descriptor, SOL_SOCKET, SO_RCVBUF, &buffer_size_LINUX, optlen_LINUX) < 0)  
  •     {  
  •         qDebug()<<"set recv buffer size FAILED.";  
  •     }  
  •     getsockopt(socket_descriptor,SOL_SOCKET,SO_RCVBUF,&buffer_size_LINUX,&optlen_LINUX);  
  • #endif