Tag: 套接字

为什么特定的UDP消息总是低于特定的缓冲区大小?

3个不同的消息以不同的速率发送到同一个端口: 消息 大小(字节) 发送每个 传输速度 高 232 10 ms 100Hz 中等 148 20ms 50Hz 低 20 60 ms 16.6Hz 我每隔约6毫秒只能处理一条消息。 单线程。 阻止阅读。 一种奇怪的情况正在发生,我没有解释。 当我将接收缓冲区设置为4,799字节时,我的所有低速消息都会被丢弃。 我看到可能有一两个被处理,然后什么都没有。 当我将接收缓冲区设置为4,800 (或更高!)时,似乎所有低速消息都开始被处理。 我看到大约每秒16/17。 这一点一直被观察到。 发送数据包的应用程序始终在接收应用程序之前启动。 创建套接字后,在开始处理之前,接收应用程序总是有很长的延迟。 因此,处理开始时缓冲区始终为满,并且每次测试发生时它都不是相同的起始缓冲区。 这是因为套接字是在发送方已经发送消息之后创建的,因此接收方可能会在发送周期的中间开始监听。 为什么增加单个字节的接收缓冲区大小会导致低速消息处理发生巨大变化? 我构建了一个表来更好地可视化预期的处理: 由于其中一些消息得到处理,因此可能会将更多消息放入队列而不是被丢弃。 尽管如此,我希望4,799字节缓冲区的行为与4,800字节相同。 然而,这不是我所观察到的。 我认为这个问题与低速消息与其他两条消息同时发送的事实有关。 它总是在高/中速信息之后接收。 (已通过wireshark确认)。 例如,假设缓冲区开始时为空,很明显低速消息需要比其他消息排队更长。 *每6ms 1条消息大约每30ms发送5条消息。 这仍然不能解释缓冲区大小。 我们正在运行VxWorks,并使用他们的sockLib,它是Berkeley套接字的一个实现。 这是我们的套接字创建的代码片段: 我正在改变SOCKET_BUFFER_SIZE 。 struct sockaddr_in tSocketAddress; // Socket address […]

在IPv4客户端/服务器应用程序中添加对IPv6的支持 – sin6_flowinfo和sin6_scope_id字段?

我致力于为多个应用程序实现IPv6支持,但我想知道这两个字段是什么。 关于这一点的问题很少,所以我不确定我做对了。 关于范围ID( sin6_scope_id ) – 好吧, Q1 , Q2 , Q3和Q4给了我关于范围ID的想法,我想我明白了。 所以,我将不得不再添加一个配置参数,以使scope-id可配置。 (我决定在这里添加,以防有人对此感兴趣)。 短时间 – 范围ID是唯一确定哪个设备应该处理流量所必需的 – 因为可能有多个接口,具有相同的IP,但具有不同的(接口?)ID。 到现在为止还挺好。 但是“流量信息”怎么样( sin6_flowinfo ) 它是为了什么? 我找不到任何有趣的东西。 我阅读了RFC,但它根本没有帮助我。 sin6_flowinfo是否有一些可能的值(比如 – 几个值,比如标志,这意味着什么),或者就像sin6_scope_id – 可能是任何值,取决于设备,我正在尝试连接? 我应该担心它,或者我只是把它留下0 (就像在Beej的网络编程指南中一样 。 是的 ,我尝试过,它有效,但我不确定它是否只适用于这种情况(如果它取决于某些网络配置),如果它设置为0 ,它将始终有效? 或者,也许,我应该让它可配置,我的意思是 – 添加一个配置选项,让用户定义它的值? google -ing“sin6_flowinfo”给了我结构定义和手册页,这个字段没什么用处。 任何有趣的来源? (可理解的一个……不是RFC:D) 编辑 :嗯,在@glglgl的回答和提示之后, sin6_flowinfo可能已经过时了,我发现了一些有趣的资料来源: RFC:IPv6流标签规范 , IETF草案:流标签作为传输层Nonce , solaris实用指南和维基百科 。 该字段不是过时的(或者我找不到这样的来源,这证实了这一点),但它看起来像0因为价值足够好。

连接(function)错误时正在进行操作错误

我想设置函数connect的超时值,但是我收到此错误:“操作正在进行中” 我的代码: if ((he = gethostbyname(authdefhost)) == NULL) { snprintf(errbuf, CERRBUFSIZ – 1, “cannot resolve %s: %s\n”, authdefhost, hstrerror(h_errno)); return -1; } sin.sin_family = AF_INET; memcpy(&sin.sin_addr, he->h_addr_list[0], sizeof(struct in_addr)); if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { snprintf(errbuf, CERRBUFSIZ – 1, "cannot create client socket: %s\n", strerror(errno)); return -1; } if ((fcntl(sd, F_SETFL, O_NONBLOCK) […]

使用C套接字发送HTTP响应

我正在尝试向浏览器发送HTTP响应 char *reply = “HTTP/1.1 200 OK\n” “Date: Thu, 19 Feb 2009 12:27:04 GMT\n” “Server: Apache/2.2.3\n” “Last-Modified: Wed, 18 Jun 2003 16:05:58 GMT\n” “ETag: \”56d-9989200-1132c580\”\n” “Content-Type: text/html\n” “Content-Length: 15\n” “Accept-Ranges: bytes\n” “Connection: close\n” “\n” “sdfkjsdnbfkjbsf”; int sd = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(8081); addr.sin_addr.s_addr = INADDR_ANY; […]

在ANSI C中获取用于给定ip的网关

我像疯了似的环顾四周,但没有得到真正的答案。 我有一个例子,但这取决于个人自己的图书馆,所以不太好。 起初我想获得接口的默认网关,但由于不同的IP可以以不同的方式路由,我很快就明白我想要的是通过使用AF_ROUTE套接字和rtm_type RTM_GET来获得用于给定目标IP的网关。 有没有人有一个例子,我实际上最终得到一个包含网关IP(或MAC地址)的字符串? 网关条目似乎是hex,但也编码在/ proc / net / route中,我猜AF_ROUTE套接字得到它的信息(但我通过内核)。 提前完成 和ps我刚刚开始使用堆栈溢出,我必须说,你们所有人都很棒! 快速回复和好的回复! 你是我最好的朋友;)

在非阻塞套接字连接中,select()始终返回1

我有这个代码段,旨在使用套接字连接连接到服务器。 但是,如果它无法在一定时间内连接到服务器,我希望它停止尝试。 我尝试使用这个非阻塞套接字和select命令执行此操作,但select总是返回1,表示当我提供的地址不存在时服务器存在。 有任何想法吗? SOCKET tcp_client( char *hname, char *sname ) { fd_set fdset; struct sockaddr_in peer; SOCKET s; FD_ZERO(&fdset); // FD_SET(STDIN, &fdset); FD_SET(s, &fdset); errno=1; struct timeval tv; tv.tv_sec = 15; set_address( hname, sname, &peer, “tcp” ); s = socket( AF_INET, SOCK_STREAM, 0 ); int n = 1; fcntl(s, F_SETFL, O_NONBLOCK); if ( !isvalidsock( […]

将stdout和stderr重定向到套接字以获取分布式shell程序

我制作了一个分布式shell程序,它有一个客户端和服务器。 客户端向服务器发送命令请求,服务器在本地执行该命令,并且应该将该命令的结果输出到客户端。 我无法弄清楚如何将stdout / stderr重定向到客户端。 我使用execvp来执行命令。 我想我可能不得不使用dup2? 但我无法弄清楚如何正确使用它。 有帮助吗?

Raw Socket Linux发送/接收数据包

在接收数据包时遇到一些问题。 我可以接收和读取传入的数据包,但我想我不会与任何主机握手。 我只想在收到答案的情况下将数据包发送到具有开放端口的远程计算机,以查看TTL(生存时间)和窗口大小。 有谁知道错误在哪里? (我对C编程知之甚少) 码: #include #include #include #include #include #include #include #include #include #include #include struct pseudohdr { u_int32_t src_addr; u_int32_t dst_addr; u_int8_t padding; u_int8_t proto; u_int16_t length; }; struct data_4_checksum { struct pseudohdr pshd; struct tcphdr tcphdr; char payload[1024]; }; unsigned short comp_chksum(unsigned short *addr, int len) { long sum = 0; […]

Raw Socket混杂模式不会嗅到我写的东西

我在混杂模式下编写一个带有Raw Socket的程序,我需要原始套接字不会嗅探我发送的数据包。 我只需要通过以太网rx线(而不是tx线)读取数据。 这是可能的吗? 非常感谢。

获取传入套接字连接的源地址

我有一个服务器,来自客户端的传入套接字。 我需要获取远程客户端的IP地址。 尝试在谷歌搜索in_addr但它有点麻烦。 有什么建议?