English 中文(简体)
采用Sockaddr_storage
原标题:API using sockaddr_storage

我试图做一些IP非神学编码编码,而且正如各种来源所建议的那样,我试图使用ock子——储存。 然而,所有APICA电话(getaddrinfo、Sapnameinfo)仍然依靠堆积机。 他们之间的争.完全是好的选择,引起许多其他问题。

而把 s子和ock子分别_倒在6种,使我试图使用ock子——储存的目的落空。

有效使用ock子的所有人——在开发简单的客户服务器袖珍应用程序时储存。

最佳回答

共同编制IPV6和IPV4方案的问题在于,纯粹的震.本身不足以让一个 s子。 因此,如果你需要盲目地通过可能会成为震.者或冲击者_in6的地址,那么,震add者——储存会更容易使用。

归根结底,你是否使用ock子、ock子6或ock子——储存,都不得不让这些点人发出呼吁,发出呼吁,放弃、连接、接受和许多其他袖珍职能。 这只是一个已知的细微细微的方案拟订。 更不用说采取某种不安全的做法。 你的法典将ok。

现在,在为IPV4和IPV6工作而撰写网络代码时,你可以很容易地进入一个陷阱,即有大量的开关说明来处理不同的网络类型。 之后,《刑法》就象以下几条:

if (addr.ss_family == AF_INET)
    sendto(sock, buffer, len, 0, (sockaddr*)&addr, sizeof(sockaddr_in))
else (addr.ss_family == AF_INET6)
    sendto(sock, buffer, len, 0, (sockaddr*)&addr, sizeof(sockaddr_in6));

这样,这种“如果家庭=AF_INET”的表述就很容易开始重复。 这是你想要避免的。

假设你正在使用C++,你就会发现,单列物体的抽象类别是令人难以置信的。 例如,见https://github.com/jselbie/stunserver/blob/master/stuncore/socketaddress.h。 CSocketAddress这一班由1{sockaddr, sockaddr_in, sockaddr_in6}组成的一个联盟支持,可与一个ock子公司建造。 如果在我开始这一轮班之前,我已经知道过大屠杀,那么我本来会利用这种说法,而不是工会。 无论如何,它允许我写以下法典:

CSocketAddress addr;
...
sendto(sock, buffer, len, 0, addr.GetSockAddr(), addr.GetSockAddrLength());

同样,“接受”声明也认为:

sockaddr_storage addrstorage = {};
int len = sizeof(sockaddr_storage);
accept(sock, (sockaddr*)&addrstorage, &len);

CSocketAdddress addr(addrstorage); // construct an address object to pass around everywhere else

这对要求、发送和停用的守则道路是令人难以置信的。 现在,我的STUN服务器和客户代码线已不复存在,不必再了解有关家庭类型袖珍地址的任何情况。 他们只是用“应急处理”物体开展工作。 唯一的IPV4和IPV6具体编码是在客户和服务器初始化期间,即地址物体实际建造。 幸运的是,这也是部分抽象的。

您也不妨利用助手职能here。 解决东道国名、列举适应者等等方面有一些更为有益的障碍。 这部法律是无赖的,但其中一部分应当把ok光描绘到Windows和取胜。

我几乎做了一些工作,为这一法典基础增添了TCP的支持。 在增加对SOCK_STREAM的支持的过程中,我没有做单一改动,也没有增加任何新的法典来应对IPV4和IPV6在结构上的分歧。

问题回答

我一般看不到需要<条码> 座标座机_storage。 其目的是为任何特定议定书的震 the结构分配足够的空间,但是,在IP-转化-异常法中,你需要做些什么? 总的来说,请打电话getaddrinfo(>,并交给您struct sockaddr *,而您则不注意是否重订了sockaddr_in 6sockaddr_in6

In typical client/server code, the main place I can think of where struct sockaddr_storage is useful is to reserve space for the second parameter to accept(). In this case I agree it s ugly to have to cast it to struct sockaddr * once for accept() and again for getnameinfo(). But I can t see a way around those casts. This is C. Structure inheritance always involves lots of casts.





相关问题
Max Outgoing Socket Connections in .NET/Windows Server

I have a slightly unusual situation where I m needing to maintain CLIENT tcp connections to another server for thousands of mobile users on my servers (basically the mobile devices connect to my ...

Determine the remaining TTL of a multicast packet in Java

If I have a Java program that listens to multicast data, how can I tell what the remaining TTL of the incoming datagram is? I know how to set the TTL on the sending multicast socket, but I want to ...

Python socket not receiving anything

I m trying to receive a variable length stream from a camera with python, but get weird behaviour. This is Python 2.6.4 (r264:75706) on linux(Ubuntu 9.10) The message is supposed to come with a ...

Connecting to a Source game server in VB.NET

I m developing an application that detects Source-based games running on the LAN. Following up on the specifications provided by Valve, I have it narrowed down to exactly what I want: making a UDP ...

What can cause select to block in Python?

Here s a snippet of code I m using in a loop: while True: print loop rlist, wlist, xlist = select.select(readers, [], [], TIMEOUT) print selected # do stuff At a certain point, ...

Socket.UseOnlyOverlappedIO?

Does anyone know what Socket.UseOnlyOverlappedIO does, and if so, does it affect performance? There seems to be no real explanation on MSDN. Thanks in advance.

热门标签