我目前正在研究UDP套接字应用程序,我需要内置支持,以便IPV4和IPV6连接可以将数据包发送到服务器.
我希望有人可以帮助我,并指出我正确的方向; 我发现的大部分文档都不完整.如果你能指出Winsock和BSD套接字之间的任何差异,也会有所帮助.
提前致谢!
我在Windows上使用MinGW编译器来编译带有套接字的C++应用程序.我的链接命令如下:
g++.exe -Wall -Wno-long-long -pedantic -lwsock32 -o dist/Windows/piskvorky { there are a lot of object files }
Run Code Online (Sandbox Code Playgroud)
而我也试过了
g++.exe -Wall -Wno-long-long -pedantic -lws2_32 -o dist/Windows/piskvorky { there are a lot of object files }
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下我都会收到此错误:
build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0x33): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0xd0): undefined reference to `send@16'
build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0x1ee): undefined reference to `recv@16'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x184): undefined reference to `WSAStartup@8'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1a5): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1cb): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1d3): undefined reference to `WSACleanup@0'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x6fe): undefined reference to `bind@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x724): undefined reference to `listen@8' …Run Code Online (Sandbox Code Playgroud) 首先,我必须问哪个国家哪个最好?例如,实时MMORPG服务器.如果我为每个客户端创建一个线程而不是使用非阻塞套接字怎么办?或者如果我使用一个包含所有非阻塞套接字的线程怎么办?你能解释一下这些优点吗?
我创建一个UDP套接字(AF_INET,SOCK_DGRAM,IPPROTO_UDP通过Winsock的),并试图recvfrom在此套接字上,但它总是返回-1,我得到WSAEINVAL(10022).为什么?
当我bind()的端口,这不会发生,但我已经读到绑定客户端的套接字是非常蹩脚的.
我正在向我的服务器发送数据,该服务器回答或至少尝试过.
Inc::STATS CConnection::_RecvData(sockaddr* addr, std::string &strData)
{
int ret; // return code
int len; // length of the data
int fromlen; // sizeof(sockaddr)
char *buffer; // will hold the data
char c;
//recv length of the message
fromlen = sizeof(sockaddr);
ret = recvfrom(m_InSock, &c, 1, 0, addr, &fromlen);
if(ret != 1)
{
#ifdef __MYDEBUG__
std::stringstream ss;
ss << WSAGetLastError();
MessageBox(NULL, ss.str().c_str(), "", MB_ICONERROR | MB_OK);
#endif
return Inc::ERECV; …Run Code Online (Sandbox Code Playgroud) 我正在将一些套接字代码从Linux移植到Windows.
在Linux中,我可以使用strerror()将errno代码转换为人类可读的字符串.
MSDN文档显示返回的每个错误代码的等效字符串WSAGetLastError(),但我没有看到有关如何检索这些字符串的任何信息.会strerror()在这里工作吗?
如何从Winsock中检索人类可读的错误字符串?
如果我使用UDP套接字进行进程间通信,我可以期望其他进程以相同的顺序接收所有发送数据吗?
我知道UDP通常不是这样.
多年来,我使用WinSock(路由器,Web /邮件/ FTP服务器等等)为Windows开发了一小部分C++服务器/客户端应用程序.
我开始越来越多地考虑创建这些应用程序的IPv6版本(当然,同时保持原始的IPv4版本).
问题:
为了参考(或为了好玩),您可以在我的应用程序的核心部分浏览IPv4代码的高峰.
我正在尝试编写一个程序来改变网络时间的默认网关.但似乎每个进程中的路由表都有缓存,因此无法准确控制网络行为.我可以将路由表刷新到该进程吗?
例如,如果我首先执行Iexplore.exe,然后将默认网关更改为韩语vpn,IE仍然会转到amercia默认网关.但是,如果我先更改默认网关然后执行Iexplore.exe,它就会转到韩国.
那么如何刷新路由表缓存呢?谢谢.
我发布了一个在线(基于网格)的视频游戏,它使用TCP协议来确保服务器 - 客户端网络拓扑中的可靠通信.我的游戏工作得相当好,但遭遇的延迟高于预期(类似的TCP游戏似乎在将延迟保持在最低限度方面做得更好).
在调查时,我发现运行Microsoft Windows(而不是Mac OS X客户端)的客户端的延迟仅意外高.此外,我发现如果Windows客户端设置TcpAckFrequency=1在注册表中并重新启动他们的计算机,他们的延迟就会变得正常.
看来我的网络设计没有考虑延迟确认:
不考虑延迟确认,Nagle算法和Winsock缓冲的交互的设计可以极大地影响性能.(http://support.microsoft.com/kb/214397)
但是,我发现几乎不可能在我的游戏(或任何游戏)中考虑延迟确认.根据MSDN,Microsoft TCP堆栈使用以下标准来决定何时在接收的数据包上发送一个ACK:
- 如果在延迟计时器到期(200ms)之前接收到第二数据包,则发送ACK.
- 如果在接收到第二数据包之前有数据要在与ACK相同的方向上发送并且延迟计时器到期,则ACK与数据段搭载并立即发送.
- 当延迟计时器到期(200ms)时,发送ACK.
阅读本文,可以假设Microsoft TCP堆栈上延迟确认的解决方法如下:
SO_SNDBUF= 0),以便send可以预期调用发送数据包.send,如果不希望立即发送更多数据,则send再次使用将被接收器丢弃的单字节数据进行呼叫.利用这种方法,接收器将在与先前数据分组大致相同的时间接收第二数据分组.因此,ACK应该立即从接收方发送到发送方(模拟TcpAckFrequency=1注册表中的内容).
但是,从我的测试来看,这个改进的延迟只有注册表编辑的一半左右.我错过了什么?
答:我选择了TCP,因为我发送的每个数据包都需要到达(并按顺序); 如果丢失(或变得无序),则没有值得重传的数据包.只有当数据包可以被丢弃/无序时,UDP才能比TCP更快!
在我的c ++类中,我会使用套接字.
链接时我有一些错误,因为,seocndo me,库缺少winsock.lib
我包括这些:
#ifdef WIN32
#include <winsock.h>
typedef int socklen_t;
typedef char raw_type;
#endif
Run Code Online (Sandbox Code Playgroud)
我如何链接图书馆winsock.lib?我使用Windows xp和visual studio 2005.