我想编写一个bash函数来检查文件是否具有某些属性并返回true或false.然后我可以在我的脚本中使用它"if".但是我该怎么回事呢?
function myfun(){ ... return 0; else return 1; fi;}
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用它:
if myfun filename.txt; then ...
Run Code Online (Sandbox Code Playgroud)
当然这不起作用.如何实现这一目标?
我对C中的套接字库有几个问题.这是我在问题中引用的一段代码.
char recv_buffer[3000];
recv(socket, recv_buffer, 3000, 0);
Run Code Online (Sandbox Code Playgroud)
recv()收到的数据包大于我的缓冲区会怎么样? strcat用于连接recv()缓冲区的最新响应?我知道这里有很多问题,但我非常感谢任何回复.
我需要知道我可以发送到另一台计算机的最大UDP数据包没有碎片.
该大小通常称为MTU(最大传输单元).据推测,在两台计算机之间,将有许多可能具有不同MTU的路由器和调制解调器.
我读到Windows中的TCP实现自动找到路径中的最大MTU.
我也在试验,我发现从我的电脑到服务器的最大MTU是57712字节+标题.上面的任何东西都被丢弃了.我的电脑在局域网上,不是MTU应该在1500字节左右吗?
我需要通过可能有损的网络将数据包从一个主机发送到另一个主机.为了最小化数据包延迟,我不考虑TCP/IP.但是,我希望最大化吞吐量uisng UDP.应该使用的UDP数据包的最佳大小是多少?
以下是我的一些注意事项:
网络中交换机的MTU大小为1500.如果我使用大数据包,例如8192,则会导致碎片.丢失一个片段会导致丢失整个数据包,对吧?
如果我使用较小的数据包,我将产生UDP和IP头的开销
如果我使用一个非常大的数据包,我可以使用的最大数据包是多少?我读到最大的数据报大小是65507.我应该使用什么缓冲区大小来发送这样的大小?这有助于提高我的吞吐量吗?
常见操作系统(例如Windows,Linux等)支持的典型最大数据报大小是多少?
更新:
数据的一些接收器是未实现TCP/IP堆栈的嵌入式系统.
我知道这个地方到处都是那些非常喜欢使用可用内容的人.但我希望能得到更好的答案,而不仅仅关注MTU.
我无法更改的应用程序是丢弃一些传入的UDP数据包.我怀疑接收缓冲区溢出.是否有注册表设置使默认缓冲区大于8KB?
最近,我们的整个QA环境从VMWare迁移到Hyper-V虚拟机.
我们的一个应用程序以每秒20K数据包的速率将UDP数据包发送到多播云.
虽然这在VMWare环境中运行良好,但Hyper-V使应用程序在几分钟的工作后抛出以下异常:
System.Net.Sockets.SocketException (0x80004005): An invalid argument was supplied
at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
Run Code Online (Sandbox Code Playgroud)
在将套接字的发送缓冲区大小定义为1,000,000字节时,我还设法立即模仿了这个问题.
我该如何解决这个问题?
更新1:一旦发生异常,这是来自事件查看器的日志条目:
Faulting application name: Agent.exe, version: 1.0.12.7366, time stamp: 0x51389f69
Faulting module name: KERNELBASE.dll, version: 6.1.7601.18015, time stamp: 0x50b83c8a
Exception code: 0xe0434352
Fault offset: 0x0000c41f
Faulting process id: 0xaf0
Faulting application start time: 0x01ce1b4ce509dc7a
Faulting application path: C:\Users\DevUser\Desktop\QA\Agent.exe
Faulting module path: C:\Windows\syswow64\KERNELBASE.dll
Report Id: d2b45dce-8740-11e2-86f9-00155d022804
Run Code Online (Sandbox Code Playgroud)
更新2:UDP数据包的大小为100-200字节.
更新3:这是有问题的代码:
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_socket.Ttl = 1; …Run Code Online (Sandbox Code Playgroud) 我创建了一些具有自己的数据ACK系统的客户端/服务器应用程序.它最初是在TCP中制作的,因为有一些限制,但基础是考虑UDP.
我发送到服务器的数据包有自己的封装(数据包ID和数据包大小标题.我知道UDP也有校验和所以我没有添加标题.),但是TCP如何工作,我知道服务器可能没有收到整个数据包,所以我收集并缓冲了收到的数据,直到收到完整的有效数据包.
现在我有机会将我的客户端/服务器程序传递给UDP,我知道与TCP的一个区别是数据没有按照发送的顺序接收(这就是为什么我添加了数据包ID头).
我想知道的是:如果我发送多个数据包,是否会收到没有保证订单但保证封装的数据包?我的意思是,如果我发送一个大小为1000字节的数据包和另一个大小为400字节的数据包,服务器将接收2个数据包,1000个字节中的一个和400字节中的另一个,或者有机会接收200个1000个字节,那1000个字节的400个字节以及之后的其他字节如TCP可以做什么?
我的目标是通过UDP协议发送结构,我的问题是我用来执行此功能的功能与其参数中的结构不兼容。(我正在使用QT)
这是我编写的代码:
void MyUDP::sendUDP()
{
typedef struct MyStructTag
{
int test1;
bool test2;
char test3;
} MyStruct;
MyStruct envoie;
// Sends the datagram datagram
// to the host address and at port.
// qint64 QUdpSocket::writeDatagram(const QByteArray & datagram,
// const QHostAddress & host, quint16 port)
socket->writeDatagram(envoie, QHostAddress("10.100.14.79"), 4000);
}
Run Code Online (Sandbox Code Playgroud)
我知道这条线是完全错误的:socket->writeDatagram(envoie, QHostAddress("10.100.14.79"), 4000);但是我不正确地使用此功能,或者该功能是否有替代方法?
谢谢您的帮助。