- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用我编写的 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/
我正在寻找 WinXP 上的 API 以在已安装的 IME 之间切换。 场景是,能够插入语言键盘(比如西类牙语)并通过单击 UI 按钮(比如名为西类牙语的按钮)更改 IME 例如我插入西类牙语键盘并单
1 在C:\WINDOWS\system32\drivers\etc\hosts 添加如下代码: 127.0.0.1 localhost 127.0.0.1 x.test.com x.test1.c
在希伯来语/希伯来语本地化安装中输入密码的可接受方式是什么?密码输入对话框是否应该与左侧追加的新字符右对齐?像这样: |----------------------| | |
我们的应用程序是内存密集型的,需要读取大量磁盘文件。总负载可以超过 3 GB。 有一个自定义的内存管理器,它使用内存映射文件来实现读取如此庞大的数据。仅当需要时,文件才会映射到进程内存空间,这样进程内
我有一种文件格式需要能够在资源管理器缩略图中显示。由于目标系统是 windows XP,因此 Vista PreviewHandler API 将不适用。我将使用 C++。 我该怎么做? 最佳答案 您
引用自 SVN 手册: In Subversion 1.6, a new caret (^) notation was introduced as a shorthand for “the URL o
一点历史:我们有一个应用程序,最初是在很多年前编写的(1998 年是 PVCS 的第一个日期,但该应用程序比它早 5 年,因为它最初是一个 DOS 程序)。此应用程序通过串行与硬件进行通信。当我们使用
我最近在开发一个网站,很大一部分依赖于JQuery的使用,目标浏览器是IE8,但是我一直在Win7机器上开发,现在才意识到之间的兼容性存在差异WinXP 和 Win7 上的 IE8。 所以很多东西都会
我向 super 用户提出了这个问题,并获得了风滚草徽章(10 天内有 13 次浏览),所以我认为这里可能是正确的地方。 我的 Windows 机器上安装了多个版本的 Python。我希望能够在默认使
我想在 Windows XP 的 python 中将键盘语言从英语更改为阿拉伯语,比如我有两行编辑,第一行用英语写,当移动到第二行时,编辑语言将自动为阿拉伯语?? 最佳答案 您正在描述一个不平凡的任务
你好,我正在编写一个将在 Windows XP 机器上运行的批处理脚本。此脚本需要能够可靠地验证作为命令行参数传递的目录是否确实存在。 假设我的脚本名为script.bat,它需要支持以下作为合法的命
复制代码 代码如下: If (Lcase(Right(Wscript.FullName,11)) = "wscript.exe") Then CreateObject(&qu
我安装了 Windows XP 和 Visual Studio 2010。 旨在使用 FxCop 检查解决方案是否符合 Microsoft 代码指南。 现在发现 FxCop 是“Microsoft W
我还使用第三方组件(在 D7、WinXP 上开发)开发了一个应用程序。当我在 XP 上部署此应用程序时,一切正常。当我在 Vista 上运行它时,应用程序停止正常工作: 工具栏上的工具按钮大小不均匀,
我在这里使用 js-ctypes 在 winxp 上使用 winapi 来获取任务栏上按钮索引 1 处的按钮。但是,这里的这一行使我的代码崩溃: var rez = SendMessage(hTool
这个问题已经有答案了: VB6 Program Crashing: Part 2. Advice on fixing Access Violation (0xC00000005) (1 个回答) 已关
按照此 py 包官方页面上的说明进行操作: https://pypi.python.org/pypi/setuptools#windows-7-or-graphical-install “对于 Win
我需要移动控制台光标位置的字符/转义序列。知道左/右/上/下光标控件会很好,但如果不可能的话,一个家(转到控制台第一行的第一个字符)。提前致谢。 最佳答案 最好的办法是使用控制台 API。这是 ref
编辑:Firefox 2 Windows XP 重现问题的步骤: Firefox 2 并访问:http://resopollution.com/rentfox/html/property_setup.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx 告诉我: If the hinst
我是一名优秀的程序员,十分优秀!