标签: winsock

如何支持IPv4和IPv6连接

我目前正在研究UDP套接字应用程序,我需要内置支持,以便IPV4和IPV6连接可以将数据包发送到服务器.

我希望有人可以帮助我,并指出我正确的方向; 我发现的大部分文档都不完整.如果你能指出Winsock和BSD套接字之间的任何差异,也会有所帮助.

提前致谢!

c++ sockets winsock ipv4 ipv6

52
推荐指数
2
解决办法
4万
查看次数

MinGW链接器错误:winsock

我在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)

c++ linker mingw winsock

46
推荐指数
2
解决办法
9万
查看次数

我为什么要使用非阻塞或阻塞套接字?

首先,我必须问哪个国家哪个最好?例如,实时MMORPG服务器.如果我为每个客户端创建一个线程而不是使用非阻塞套接字怎么办?或者如果我使用一个包含所有非阻塞套接字的线程怎么办?你能解释一下这些优点吗?

c++ sockets winsock

38
推荐指数
2
解决办法
3万
查看次数

我是否必须在客户端程序中绑定UDP套接字才能接收数据?(我总是得到WSAEINVAL)

我创建一个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)

c++ winsock

28
推荐指数
3
解决办法
6万
查看次数

如何从WSAGetLastError()中检索错误字符串?

我正在将一些套接字代码从Linux移植到Windows.

在Linux中,我可以使用strerror()将errno代码转换为人类可读的字符串.

MSDN文档显示返回的每个错误代码的等效字符串WSAGetLastError(),但我没有看到有关如何检索这些字符串的任何信息.会strerror()在这里工作吗?

如何从Winsock中检索人类可读的错误字符串?

c sockets winapi winsock

26
推荐指数
3
解决办法
2万
查看次数

通过同一台机器上的UDP套接字发送数据是否可靠?

如果我使用UDP套接字进行进程间通信,我可以期望其他进程以相同的顺序接收所有发送数据吗?

我知道UDP通常不是这样.

c sockets windows udp winsock

24
推荐指数
3
解决办法
3530
查看次数

将C++ TCP/IP应用程序从IPv4转换为IPv6.难?值得麻烦吗?

多年来,我使用WinSock(路由器,Web /邮件/ FTP服务器等等)为Windows开发了一小部分C++服务器/客户端应用程序.

我开始越来越多地考虑创建这些应用程序的IPv6版本(当然,同时保持原始的IPv4版本).

问题:

  1. 我可能遇到什么陷阱?
  2. 移植/转换难度很大吗?
  3. 转换是值得的吗?


为了参考(或为了好玩),您可以在我的应用程序的核心部分浏览IPv4代码的高峰.

c++ tcp winsock ipv4 ipv6

21
推荐指数
3
解决办法
1万
查看次数

如何在Windows中刷新路由表?

我正在尝试编写一个程序来改变网络时间的默认网关.但似乎每个进程中的路由表都有缓存,因此无法准确控制网络行为.我可以将路由表刷新到该进程吗?

例如,如果我首先执行Iexplore.exe,然后将默认网关更改为韩语vpn,IE仍然会转到amercia默认网关.但是,如果我先更改默认网关然后执行Iexplore.exe,它就会转到韩国.

那么如何刷新路由表缓存呢?谢谢.

windows routes winsock

21
推荐指数
2
解决办法
22万
查看次数

TCP延迟确认的解决方法是什么?

我发布了一个在线(基于网格)的视频游戏,它使用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.

(http://support.microsoft.com/kb/214397)

阅读本文,可以假设Microsoft TCP堆栈上延迟确认的解决方法如下:

  1. 禁用Nagle算法(TCP_NODELAY).
  2. 禁用套接字的发送缓冲区(SO_SNDBUF= 0),以便send可以预期调用发送数据包.
  3. 在呼叫时send,如果不希望立即发送更多数据,则send再次使用将被接收器丢弃的单字节数据进行呼叫.

利用这种方法,接收器将在与先前数据分组大致相同的时间接收第二数据分组.因此,ACK应该立即从接收方发送到发送方(模拟TcpAckFrequency=1注册表中的内容).

但是,从我的测试来看,这个改进的延迟只有注册表编辑的一半左右.我错过了什么?


问:为什么不使用UDP?

答:我选择了TCP,因为我发送的每个数据包都需要到达(并按顺序); 如果丢失(或变得无序),则没有值得重传的数据包.只有当数据包可以被丢弃/无序时,UDP才能比TCP更快!

c c# c++ winsock

21
推荐指数
1
解决办法
1万
查看次数

如何链接winsock.lib?

在我的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.

c++ sockets windows-xp visual-studio-2005 winsock

19
推荐指数
2
解决办法
4万
查看次数

标签 统计

winsock ×10

c++ ×7

sockets ×5

c ×3

ipv4 ×2

ipv6 ×2

windows ×2

c# ×1

linker ×1

mingw ×1

routes ×1

tcp ×1

udp ×1

visual-studio-2005 ×1

winapi ×1

windows-xp ×1