Tag: 网络

数据与网络编程对齐

关于数据对齐,我有点困惑。 在x86上,我们通常认为对齐是理所当然的。 但是,我正在对一个非常严格的系统进行编程,如果我尝试访问未对齐的数据,则会出错。 inheritance人我的问题: 首先,我将向您展示我的一些结构: struct sniff_ethernet { u_char ether_dhost[6]; /* Destination host address */ u_char ether_shost[6]; /* Source host address */ u_short ether_type; /* IP? ARP? RARP? etc */ }; struct sniff_ip { u_char ip_vhl; /* version <> 2 */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short […]

在不同的机器上运行UDP客户端和服务器

我在同一台计算机上运行时有一个UDP客户端和运行正常的服务器。 (这里为客户端我已经将127.0.0.1作为UDP客户端上的目标IP)。 但是,当在不同的机器上运行,并用我的server.c所在机器的ip替换127.0.0.1时,该程序不起作用。 问题是我没有收到任何错误消息。 以下是服务器和客户端的代码。 请告诉我在不同的机器上运行相同的任何修改(我使用的是LINUX OS)。 注意:我的机器服务器IP (存在server.c的机器): 10.60.5.945 , clientIP:10.60.5.950 server.c: #include #include #include #include #include #include #include #include int main() { int cont,create_socket,new_socket,addrlen,fd; int bufsize = 1024; int nameLen=0; int client_address_size=0; char *buffer = malloc(10); char fname[256]; struct sockaddr_in address,client; if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) > 0) printf(“The socket was created\n”); address.sin_family = […]

getaddrinfo:如果指定了节点名,AI_PASSIVE会以什么方式被忽略?

引用getaddrinfo的规范: 如果指定了AI_PASSIVE标志,则返回的地址信息应适合用于绑定套接字以接受指定服务的传入连接。 在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为INADDR_ANY对于IPv4地址)或IN6ADDR_ANY_INIT (IPv6地址)。 这是有道理的。 如果指定AI_PASSIVE ,则可以在返回的地址上bind() / listen() / accept() 。 如果nodename为null,则返回的地址将绑定到所有网络接口,因此您可以使用任何计算机的IP地址(例如,以太网LAN IP,Wi-Fi LAN IP,环回地址等)。 摘要:在服务器上使用AI_PASSIVE (对于TCP套接字)。 继续: 如果未指定AI_PASSIVE标志,则返回的地址信息应适合于调用connect() (用于连接模式协议)或调用connect() , sendto()或sendmsg() (用于无连接协议)。 在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为环回地址。 这也是有道理的。 如果未指定AI_PASSIVE ,则可以在返回的地址上connect() / sendto() / sendmsg() 。 如果nodename为null,则获取环回地址。 简介: 不要在客户端上使用AI_PASSIVE (对于TCP套接字)。 继续: 如果nodename参数不为null,则应忽略AI_PASSIVE标志。 咦? 忽略 AI_PASSIVE标志甚至意味着什么? 从前两个引号来看,听起来AI_PASSIVE仅用于确定您是否获得适合服务器/客户端使用的地址,并且在这两种情况下,它听起来像一个null nodename只是为您提供INADDR_ANY地址(用于服务器)或环回地址(对于客户)。 忽略 AI_PASSIVE标志有什么用呢? 这最后一句话的真正含义是什么? 它如何影响前两个引号?

通过C程序获取Linux中的网络接口类型

如何从Linux中的C程序获取网络接口的类型名称? 我尝试使用getifaddr访问网络接口,我得到了我需要的一切,除了它的类型名称。 有什么想法可以做到吗? 我还是Linux新手,所以对任何变通办法或示例代码的任何评论都会受到赞赏。 编辑 详细说明问题。 基本上,在做ifconfig我可以得到这样的东西: eth0链接封装:以太网HWaddr 00:0C:29:40:93:9C inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0 inet6 addr:fe80 :: 20c:29ff:fe40:939c / 64范围:链接 UP BROADCAST RUNNING MULTICAST MTU:1500公制:1 RX数据包:14785错误:0丢弃:0超限:0帧:0 TX数据包:429错误:0丢弃:0溢出:0载波:0 碰撞:0 txqueuelen:1000 RX字节:961439(938.9 KiB)TX字节:71866(70.1 KiB) 中断:67基地址:0x2000 以下是我所理解的eth0是接口名称。 虽然可以有多个网络接口(eth0,eth1,eth2)和几个虚拟接口(tap0,tap1等)和无线接口,但它们都是以太网接口。 环回也一样,作为接口名称,其接口是Local Loopback。 所以问题是,我怎样才能使用C程序打印eth0,tap0,wlan0属于以太网类型,并且lo – >到本地环回类型,当我事先不知道使用什么接口和多少他们在机器里。 希望我能正确解释一下。

建议使用C发送块大小?

我有一台服务器,每个请求需要传输大量数据(~2-2演出)。 每次调用发送应该具有的建议数据量是多少? 有关系吗?

如何发送大小超过64 KB的UDP数据包

我无法发送大小超过64 KB的IP multicast datagrams (对于我的实验,我需要这样做)。 我正在通过10 Gigabit ethernet链路直接连接的计算机之间传输数据包(中间没有任何跳跃,由traceroute确认)。 所有计算机都安装了Ubuntu 12.04。 我通过在/etc/sysctl.conf添加以下行来更改读写缓冲区的限制: net.core.rmem_max=12582912 net.core.wmem_max=12582912 net.core.rmem_default=12582912 net.core.wmem_default=12582912 并使用sysctl -avalidation了更改(运行sysctl -p之后)。 我是否需要重新启动才能看到更改? (我正在共享机器,所以不总是可以重启)。 用于发送和接收的接口的MTU在所有计算机中都是9000字节。 我已成功发送大小约为60 KB的数据包,对于100 KB数据包,使用tcpdump捕获显示数据包甚至没有被发送并且可能被内核丢弃(我没有在tcpdump跟踪中看到它们)。 为了能够传输大数据包(最好是100 MB的大小),我还需要做些什么?

嵌入式Windows XP中的网络接口设置

如何根据设备描述(即“设备属性 – >连接使用:”文本框中显示的字符串)获取网络接口名称(即出现在“网络连接”对话框中的名称)? 我们必须使用纯C / C ++语言,或通过一些标准命令行工具(例如netsh,ipconfig …)或两者的组合来实现。 由于部署问题,我们无法使用.NET API(应用程序必须在没有.NET Framework的情况下在嵌入式XP上运行)。 SDK API GetIfTable和GetIfEntry似乎很有希望,但在我们的系统上,所有MIB_IFROW字段都被正确填充,除了“wszName”字段,它仍然未初始化。

getaddrinfo addrinfo导致堆栈或堆

至少我有点困惑。 getaddrinfo()调用’updates’指向addrinfo结构的指针,当我要在相同的范围(该函数)中使用addrinfo时,一切都很好但是如果我将结构复制到另一个(通过分配它)会发生什么。 请帮助我理解正在进行的基础知识(不寻求替代方法的建议)。 如果我错了,请纠正我:a)getaddrinfo()需要指向addrinfo的struct-pointer的指针。 b)getaddrinfo在当前函数作用域中创建addrinfo结构并更新a)中所需的指针 现在我真正的问题是:我想将addrinfo存储在其他地方。 使用分配给另一个指针不会执行深层复制,并且在该函数之后所有指针都变为无效? 最好给出一个非常简单的例子: void GetAddrInfo(struct addrinfo *update) { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); //is this save? After this ‘scope’ ends all pointed fields are invalid? //this doesn’t copy the linked list ai_next. *update=*res; } 直接使用和更新getaddrinfo似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁。 任何人都可以在这里给我更多的见解(请解释在哪里创建的内容和销毁位置,堆栈,堆欢迎所有信息)

IOS4 – 使用UDP套接字发送数据

我刚刚开始在iPhone上开发网络。 我需要开发一个简单的应用程序来与Wifi路由器交谈。 问题是,wifi盒通过UDP进行通信。 我已经挖了很多,但到目前为止我看过的所有示例代码都有TCP通信的例子,除了一个; UDPEcho示例。 所以,我的问题是:1。我如何知道WiFi网络上的设备是否可以通过WiFi连接? 2.为了在UDP上进行通信,我可以简单地创建一个套接字,并使用CFSocketSendData方法将数据发送到某个地址吗? 它看起来像UDPEcho示例,首先创建一个主机,然后解析它,然后获取一个地址,并在绑定到套接字后发送一些数据。 我想要一个简单的原始实现,只需发送数据包并接收数据包作为响应。 任何链接或参考都会有所帮助。 更有帮助的是,原始实现的一些基本步骤。 简单来说,我可以执行以下操作:1。使用CFSocketCreate创建套接字,在数据可供读取时指定回调。 2.使用CFSocketSend在套接字上发送数据,指定我要发送的地址。 编辑:我创建了一个类SocketTest,然后调用connect:后跟sendData。 这是代码: #include “SocketTest.h” @implementation SocketTest – (BOOL)connectSocket{ CFSocketRef appSocket; const CFSocketContext socketContext = { 0, self, NULL, NULL, NULL }; CFRunLoopSourceRef socketRunLoopSourceRef; struct sockaddr_in deviceAddress; /** We have to bind a machine address to the socket which we will create. For […]

创建多个线程后Pthread_create失败

我正在开发一个处理客户端连接的应用程序。 我正在为每个请求生成一个线程,因为会有短任务。 但是,在处理一定数量的连接后,我一直遇到问题。 具体来说,在381个连接之后,pthread_create无法创建新线程。 我知道如果应用程序资源耗尽,或者已经创建了超过PTHREAD_THREADS_MAX个线程,这可能会失败。 奇怪的是,当发生此错误时,前381个线程已经停止。 我没有使用pthread_join来等待这些线程停止,我相信pthreads不要求我以某种方式“停止”线程,如果我错了就纠正我(至少manpage没有提到这个)。 我想也许这可能是在同时产生多个线程时产生的,但是,我已经多次测试过,每次第382个线程创建都失败了。 有谁知道会发生什么? 任何帮助将不胜感激。 提前致谢。