Tag: 网络

为什么8位字段具有字节序?

请参阅/netinet/tcp.h中TCP头的定义: struct tcphdr { u_int16_t th_sport; /* source port */ u_int16_t th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ # if __BYTE_ORDER == __LITTLE_ENDIAN u_int8_t th_x2:4; /* (unused) */ u_int8_t th_off:4; /* data offset */ # endif # if __BYTE_ORDER == __BIG_ENDIAN u_int8_t th_off:4; /* data […]

如何做简单,可靠的网络短信?

我现在正在使用套接字在各种进程之间进行通信。 一切都在同一台机器上运行,所以没有数据包丢失,我也没有读取超时等。消息通常是小数据块(JSON,有时是二进制)。现在我想做跨机器通信。 客户端/服务器连接通常如下所示:客户端告诉服务器开始某些处理(传递任务描述),服务器完成工作并回传进度,客户端可以选择在中间发送终止消息。 完成后,服务器将在客户端完全断开连接时保持监听(即会话结束,启动新任务会启动新会话。) 我该如何实施沟通? 我可以轻松地继续在网络上使用套接字,但我的理解是,我现在需要添加大量的error handling来识别消息何时无法通过并以某种方式将其传达回服务器。 我想要的只是send(message, target)并确保完整的消息被传输; 当对方死了时加上一些通知。 我已经看到有一些像zero-mq这样的库声称可以做到这一点但也有更多,我不确定这样的消息库是否真的是必要的。 有一些易于使用的库可以做一些基本的沟通吗? 我正在使用C ++和Python,而且BSD样式许可证绝对是库的首选。 图书馆也应该相当稳定,因为沟通部分并不是真正重要的,我希望能够坚持一个解决方案。

子网中的所有IP(C)

有人有一个很好的例子,我可以使用CIDR(如192.168.1.1/24获取IP地址,并返回该范围内的所有IP地址,如192.168.1.1, 192.168.1.2, 192.168.1.3 … 我很好用它返回一个unsigned long ,一个char或类似的东西 /* Pseudocode */ while(currnetip <= finalip) { print(currnetip); currnetip++; } 只要我能理解它就好了。 如果您认为它可以帮助我,请随意评论一个post的链接。 编辑:可能值得一提的是我发现了许多计算广播地址的东西,我只是不确定如何将所有这些function链接在一起。

在C:代理HTTP请求到另一台服务器

我正在尝试将HTTP请求代理到另一个HTTP服务器。 上游HTTP服务器的主机名和端口号分别为server_proxy_hostname和server_proxy_port。 第一步是对server_proxy_hostname进行DNS查找。 其次 ,我创建了一个网络套接字并将其连接到我从DNS获得的IP地址。 最后一步 :在两个套接字上等待新数据。 当数据到达时,我立即将其读取到缓冲区,然后将其写入另一个套接字。 这维持HTTP客户端和上游HTTP服务器之间的双向通信。 如果任何一个sockets关闭 ,我关闭另一个sockets 。 现在的问题是它无法正常工作。 (它超时) 我相信我获取IP地址的方式是正确的,所以问题必须是我的while循环(它永远不会终止?)或我调用connect()的部分。 我尝试为read()和select()添加错误终止,但这也不起作用。 void handle_proxy_request(int fd) { char * targetHostName = server_proxy_hostname; int targetPort = server_proxy_port; struct hostent *info; info = gethostbyname(targetHostName); struct in_addr ** ipAddresslist; ipAddresslist = (struct in_addr **) (info -> h_addr_list); struct in_addr * ipAddress = ipAddresslist[0]; printf(“ip address […]

statvfs可以阻止某些网络设备吗? 如何处理这种情况?

我正在使用keybase(用于SSH和其他密钥的云基础数据存储),而今天我以某种方式在启动X-Windows时没有重新启动。 结果,命令df (以及我的代码中的statvfs()在告诉我传输已关闭后才会阻塞。 $ df df: ‘/home/alexis/”/home/alexis/.local/share/keybase/fs”‘: Transport endpoint is not connected df: /run/user/1000/gvfs: Transport endpoint is not connected _ 提示将坐在那里,永远不会回来。 我不太关心df会不会被卡住,但我想知道我应该如何更新我的C ++代码以处理statvfs()在我的应用程序中阻塞的情况,因为那是不可接受的。 我没有看到一种方法在不使用信号的情况下突破该呼叫(想到SIGALRM)。 有没有更好的方法来处理这种情况? (注意:我的代码是用C ++编写的,虽然C解决方案应该可以正常工作,但很可能是需要的,因此用两种语言进行标记。)

如何在会话期间获得新的套接字连接?

我正在使用带有send()和recv() C风格TCP套接字。 我在用户A和用户B之间运行连接,其中用户A充当服务器,用户B充当客户端。 我希望有一个被动用户C,它不会进行任何通信,但会从用户A接收数据。但是,新的被动用户C可以随时加入会话。 A可能会发送与发送B不同的C数据包。我想AC最好在不同于AB的端口上进行通信 如何在任意通信点进行这种连接(没有线程等)? 编辑仍未解决。

如何限制客户端服务器程序中的连接数

我想要一个服务器程序,它应该只接受最多一个连接,它应该丢弃其他连接。 我怎样才能做到这一点?

为什么我的snmp包无效

我在这里写了一个类似的问题,但没有得到解决我的问题的答案,所以我再次在stackoverflow上写这个问题,并希望有人可以帮助我。 这是一个关于我的问题的可运行的例子。 数据包out_buf_0表示有效的SNMP数据包,可以通过UDP发送。 数据包out_buf_1与out_buf_0相同,只有一个字符在结尾out_buf_0处。 此外,由于附加角色,我提高了所有长度+ 1。 为什么out_buf_1不是有效的SNMPv1数据包/为什么它不能通过UDP发送? 注意:SNMP请求无法在终端中显示,因为来自客户端的请求ID与out_buf_0和out_buf_1不同,请查看wireshark以查看请求/响应。 包括我的SNMPv1数据包out_buf_0在内的整个帧长度是1368位, out_buf_1应该是1376位。 #include #include #include #include #include #include #define MESSAGE_MAX_LEN 1500 /* MTU, IEEE Std 802.3TM-2015 */ #define PORT 161 /* RFC 1157 */ int out_buf_0_len = 129; /* 0x7f + 2 */ char out_buf_0[] = { 0x30, /* SNMP Packet start */ 0x7f, /* SNMP Packet […]

为什么我在C服务器程序中遇到分段错误(但有时只是)?

现在,我正在尝试编写一个简单的客户端/服务器应用程序,以便测量LAN上的各种大小的TCP消息的往返时间(我正在做时间客户端)。 该程序适用于小数据包大小(> 1000字节),但我最终得到一个分段错误:输入更大(10KB或更大)的11错误。 int main() { struct sockaddr_in sin; char buf[MAX_LINE]; int len; int s, new_s; /* build address data structure */ bzero((char *)& sin, sizeof( sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons( SERVER_PORT); /* setup passive open */ if (( s = socket( PF_INET, SOCK_STREAM, 0)) < 0) { perror("tcp program: […]

Telnet客户及其对EOL的处理

这是一个相当复杂的问题,为此我道歉。 我写了一个Linux C套接字应用程序,一个简单的聊天服务器的基本框架。 服务器正在我的笔记本电脑上运行。 客户端是Telnet,直到我编写指定的客户端应用程序(这将更加安全,希望如此)。 我知道,有更好的应用程序可以从客户端发送通用网络数据,但我对为什么某个东西在一个Telnet客户端而不是另一个客户端上发生感兴趣。 第一个Telnet客户端测试是在另一台Linux笔记本电脑上。 它按预期工作。 然而,下一个是一个名为BBSSH的Blackberry应用程序,允许Telnet和SSH连接。 我通过Telnet选项,它也有效。 除此之外,它并不完全正确。 服务器代码执行通常的read调用以检索数据块,该数据块被视为字符串,即消息。 前客户端读取,直到我按Enter键,然后它发送一个字符串。 然而,BB应用程序会发送每一个字符,就像我在每个字符后按下输入一样,我没有。 显然这与缓冲有关,某些客户端从用户输入中选择EOL等等。我只是无法确定它。 为了说明,这是服务器输出从客户端收到的消息。 首先,来自Linux客户端的消息: client name: this is a test 现在,对于BBSSH: client name: t client name: h client name: i client name: s client name: client name: i client name: s client name: client name: a client name: client name: t client […]