gpt4 book ai didi

windows - Linux 到 WinXP over UDP 滞后

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:22 25 4
gpt4 key购买 nike

我在使用我编写的 UDPSocket 包装器时遇到问题。我有一个高带宽低延迟本地网络,我通过它来回发送 UDP 数据包。我不太关心数据包到达的可靠性,但是数据包到达的速度如此之快是非常重要的。下面是设置套接字的相关代码:

bool UDPSocket::create() {
int on = 1;
#ifdef WIN32
if(WSAStartup(MAKEWORD(1,1), &SocketInfo) != 0) {
MessageBox(NULL, "Cannot initialize WinSock", "WSAStartup", MB_OK);
}
#endif
m_sock = socket(PF_INET, SOCK_DGRAM, 0);
#ifdef WIN32
if(setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) == SOCKET_ERROR)
return false;
#else
if(setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) == -1)
return false;
#endif
addrLen = sizeof(struct sockaddr);
return true;
}

bool UDPSocket::bind(const int port) {
if(!is_valid())
return false;
m_addr.sin_family = AF_INET;
m_addr.sin_addr.s_addr = htonl(INADDR_ANY);
m_addr.sin_port = htons(port);

if(::bind(m_sock, (struct sockaddr*)&m_addr, sizeof(m_addr))<0) {
std::cout << "UDPSocket: error on bind" << std::endl;
return false;
}
return true;
}
bool UDPSocket::send(const std::string s) const {
const char* buf = s.c_str();

::sendto(m_sock, buf, strlen(buf), 0, (const sockaddr*)&clientAddr, addrLen);
return true;
}

bool UDPSocket::setDestination(const std::string ip, const int port) {
memset(&clientAddr, 0, sizeof(clientAddr));

clientAddr.sin_family = AF_INET;
clientAddr.sin_addr.s_addr = inet_addr(ip.c_str());
clientAddr.sin_port = htons(port);

return true;
}

int UDPSocket::recv(std::string& s) const {
char buffer[MAXRECV + 1];
struct timeval tv;
fd_set fdset;
int rc, nread;

memset(&buffer, 0, sizeof(buffer));

FD_ZERO(&fdset);
FD_SET(m_sock, &fdset);

tv.tv_sec = 0;
tv.tv_usec = m_timeout;

rc = select(m_sock + 1, &fdset, (fd_set *) 0, (fd_set *) 0, &tv);

if(FD_ISSET(m_sock, &fdset)) {
#ifdef WIN32
nread = ::recvfrom(m_sock, buffer, MAXRECV, 0, (sockaddr*)&clientAddr, const_cast< int * __w64 >(&addrLen));
#else
nread = ::recvfrom(m_sock, buffer, MAXRECV, 0, (sockaddr*)&clientAddr, (socklen_t*)&addrLen);
#endif
if(nread < 0) {
return -1;
} else if(nread == 0) {
return 0;
}
s = std::string(buffer);
return nread;
} else {
return 0;
}
}
void UDPSocket::set_non_blocking(const bool b) {
mNonBlocking = b;
#ifdef WIN32
u_long argp = b ? 1 : 0;
ioctlsocket(m_sock, FIONBIO, &argp);
#else
int opts = fcntl(m_sock, F_GETFL);
if(opts < 0) return;
if(b)
opts |= O_NONBLOCK;
else
opts &= ~O_NONBLOCK;

fcntl(m_sock, F_SETFL, opts);
#endif
}

我的用户代码,在两端,创建一个“发送”和“接收”UDPSocket 并将它们绑定(bind)到各自的端​​口,然后使用 send() 发送数据和 recv() 接收。一方面,linux 端似乎几乎立即接收,但 Windows 端在接收数据之前最多有 1 秒的延迟。但是,::recv() 不会在此时返回 0。我是否遗漏了一些明显的东西?

最佳答案

您是否尝试过所有四种组合(linux->linux、win->linux、linux->win、win->win)?哪些有延迟,哪些没有?

另外,使用数据包嗅探器(如 tcpdump 或 wireshark)来查看延迟是在到达线路之前还是之后。

关于windows - Linux 到 WinXP over UDP 滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1072054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com