根据我的知识,如果必须设计互联网应用程序,我们应该使用面向连接的服务或无连接服务,但不能同时使用两者.
Internet的面向连接的服务是TCP,无连接服务是UDP,它们都驻留在Internet协议栈的传输层中.
Internet唯一的网络层是IP,这是一种无连接服务.所以它意味着我们设计的任何应用程序最终都使用IP来传输数据包.
面向连接的服务使用相同的路径来传输所有数据包,而无连接则不会.
因此我的问题是
如果设计了面向连接的应用程序,它应该使用相同的路径传输数据包.但IP通过使用不同的路由打破了规则.那么TCP和IP如何在这个意义上协同工作?这让我很困惑.
我们有一个TCP流协议,我们通过大小为数据有效负载添加前缀.因此,数据可以在收到时正确解码.很标准的东西.
这对成千上万的人来说很好.不幸的是,我们至少有4个客户端存在连接问题的案例,都在偏远国家.俄罗斯的一位客户已经能够帮助我们进行大量测试并缩小问题范围.如果我们发送一个强制前缀大小为0的数据包,则整个数据包将通过.如果数据包数据以数据包开始1c将无法通过.
我有两个并排的Wireshark从他的电脑中捕获,显示:
Working
-------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
00000000000000001c0000000000000000000000000000000000000000000000
Toronto -> Rusion [PSH,ACK] <- server in toronto got the data, sent a reply!
Not-Working
--------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
1c000000000000001c0000000000000000000000000000000000000000000000
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] …Run Code Online (Sandbox Code Playgroud) 我正在发送一个文本文件 - 客户端 - 服务器将文本分解为每个512字节的数据包,但是一些数据包包含的文本小于最大大小所以在接收每个数据包的服务器端我正在调用malloc()再次构建一个字符串这是一种不好的做法吗?保持一个适合最大长度的工作缓冲区并保持迭代,复制和覆盖它的值更好吗?
好吧@nm这里是代码,这个if是在select()唤醒的for(;;)循环里面
if(nbytes==2) {
packet_size=unpack_short(short_buf);
printf("packet size is %d\n",packet_size);
receive_packet(i,packet_size,&buffer);
printf("packet=%s\n",buffer);
free(buffer);
}
//and here is receive_packet() function
int receive_packet(int fd,int p_len,char **string) {
*string = (char *)malloc(p_len-2); // 2 bytes for saving the length
char *i=*string;
int temp;
int total=0;
int remaining=p_len-2;
while(remaining>0) {
//printf("remaining=%d\n",remaining);
temp = recv(fd,*string,remaining,0);
total+=temp;
remaining=(p_len-2)-total;
(*string) += temp;
}
*string=i;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我写了很多网络系统,并且很清楚网络是如何工作的.但是我总是最终拥有一个数据包接收功能,这是一个巨大的switch语句.这开始转向我.我宁愿采用一种优雅的面向对象的优雅方式来处理接收数据包,但每当我尝试提出一个好的解决方案时,我总会遇到问题.
例如,假设您有一个网络服务器.它只是在那里等待回应.数据包进入,服务器需要验证数据包,然后需要决定如何处理它.
目前我一直在通过打开标头中的数据包ID然后拥有一大堆处理每种数据包类型的函数调用来实现这一目标.对于复杂的网络系统,这会产生一个单一的switch语句,我真的不喜欢这样处理它.我考虑过的一种方法是使用处理程序类的映射.然后我可以将数据包传递给相关的类并处理传入的数据.我遇到的问题是我需要一些方法来使用地图"注册"每个数据包处理程序.这意味着,通常,我需要创建类的静态副本,然后在构造函数中将其注册到中央数据包处理程序.虽然这有效,但它看起来似乎是处理它的一种不雅和繁琐的方式.
编辑:同样,理想的是拥有一个兼顾两种方式的漂亮系统.即一种类结构,它容易处理发送与接收它们相同的数据包类型(显然通过不同的功能).
有人能指出我更好的方法来处理传入的数据包吗?非常感谢链接和有用的信息!
如果我没有很好地描述我的问题而道歉,因为我无法很好地描述它也是我从未设法提出解决方案的原因.
我有二进制例如:
<<32,16,10,9,108,111,99,97,108,104,111,115,116,16,170,31>>
Run Code Online (Sandbox Code Playgroud)
我怎么知道这个包的长度是多少?
谢谢.
我正在开发一个C++服务器/ .NET客户端应用程序,其中我的服务器(在Linux上运行c ++)广播一条消息,表明它对整个网络都是活跃的,我的.NET程序监听数据包并解析以获得正常运行时间的服务器.
正如我所读到的,要将常规UDP广播发送到广播地址,我只需要发送一个数据包到192.168.0.255(在我的情况下为192.168.2.255)或255.255.255.255.这是正确的吗?我可以使用相同的端口地址吗?还有其他必需品吗?
我理解如果我的.NET程序侦听该特定地址,则可以接收来自除我的C++服务器程序之外的其他应用程序的数据包.是否有任何方法在C++服务器端"签名"数据包,以便我的.NET程序读取数据包的标题,并看到它(几乎)是我正在寻找的那个?
我在主机和交换机之间有一个链接.
该链路具有带宽和延迟.如何计算从主机A传输到交换机1的2个数据包(大小为1KB)的时间?
这是图(我说的是第一个链接)

注意:我只想手动计算这些值,我想知道计算这些问题的原则/规律.
我想拦截数据包并获取IP /端口号,以及连接的PID/UID.我正在考虑的事情以及不在下面的事情......
所以,最终,我的问题是,如何使VpnService只是将数据包重新路由到它们最初去往/来自的位置.
任何有关此事的帮助将不胜感激.
谢谢!
我正在为USB设备编写代码.假设USB主机启动控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的wLength)是端点0最大数据包大小的倍数.然后在主机收到所有数据(以几个具有最大数据包的IN事务的形式)之后,它是否会启动另一个IN事务以查看是否有更多数据,即使没有更多数据?
以下是我想知道的一系列事件示例:
我在我的计算机上测试了这个(Windows Vista,如果它很重要),答案是否定的:主机足够聪明,知道无法从设备接收到更多数据,即使设备发送的所有数据包都已满(端点0上允许的最大大小.我想知道是否有任何主机不够智能,并将尝试执行另一个IN事务并期望接收零长度数据包.
我想我从usb.org上读到了USB 2.0和USB 3.0规范的相关部分,但我没有发现这个问题.如果有人能指出我在其中任何一个文件中的正确部分,我将不胜感激.
我知道如果设备选择发送的数据少于wLength中请求的主机,则可能需要零长度数据包.
我知道我可以使我的代码足够灵活,以处理任何一种情况,但我希望我没有必要.
感谢任何能够回答这个问题的人!
为了从服务器接收UDP广播包到android设备,我使用服务类并在线程中侦听数据包.它成功接收数据包.问题是如果在同一时间从服务器发送多个数据包,那么将导致数据包丢失.
我甚至尝试使用队列并在单独的线程中处理收到的数据包,然后我也没有收到数据包.我对网络编程完全陌生,任何帮助都会受到广泛赞赏
void startListenForUdpBroadcast() {
UDPBroadcastThread = new Thread(new Runnable() {
public void run() {
try {
InetAddress broadcastIP = InetAddress.getByName(UdpConstants.IP_ADDRESS);
Integer port = UdpConstants.RECEIVER_PORT;
while (shouldRestartSocketListen) {
listenAndWaitAndThrowIntent(broadcastIP, port);
}
} catch (Exception e) {
Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage());
}
}
});
UDPBroadcastThread.setPriority(Thread.MAX_PRIORITY); //Setting The Listener thread to MAX PRIORITY to minimize packet loss.
UDPBroadcastThread.start();
}
Run Code Online (Sandbox Code Playgroud)
此代码侦听新数据包并推送到队列
private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception {
byte[] recvBuf = new …Run Code Online (Sandbox Code Playgroud)