我正在使用套接字API编写C语言中的服务器 - 客户端编程,我试图将控制信息发送到客户端以使用不同的TCP连接。 每当服务器创建新套接字(TCP)时,我希望它通知客户端使用新套接字进行进一步的通信。目前我已经考虑过将UDP数据包发送到客户端进行通知。一旦客户端收到数据包,它就会将ACK发送回服务器,同时切换到另一个TCP连接。 我想知道,除了使用UDP之外,还有更好的通过网络传输控制数据,因为它不可靠.Thnx
我想详细说明我想要实现的目标。我将测量带宽,延迟,接收窗口等参数作为Ipv4和IPv6 TCP连接的度量。基于观察到的性能,我将在提供更好性能的两个协议之间切换。一旦决定切换,我必须通知合作伙伴(可能是客户端或服务器,基于我测量上传,下载的带宽类型) 。我从IPv4连接开始,同时打开另一个连接 - 用于测量带宽和延迟的IPv6。
如果IPv6连接提供更好的性能,我需要告诉客户端切换到IPv6。在这种情况下,两个连接都是开放的,用于周期性地监视带宽以决定切换。所以我在这方面有两个问题。 1.一次保持两个连接是一个好主意。只有当我需要测量度量时才能创建另一个连接,因为两台机器之间的路径几乎不会改变。如果是,我可以使用控制信息传递另一个TCP连接告诉客户端切换。通过这种方式,我还可以测量带宽并通知客户端
两个有两个TCP连接并不是一个好主意,我可以使用UDP来发送控制信息。我避免发送用于传输实际数据的conn的控制信息,因为这将是一个开销。我的代码将像中间件一样用于传输数据,应用程序将调用我的函数/宏来传输数据,内部代码将负责测量带宽和决定切换。我希望我清楚我的内容想要实现。感谢您的反馈意见
答案 0 :(得分:1)
服务器端侦听TCP套接字的正常操作顺序是:
int fd1 = socket(...); // Create socket - assuming TCP, not UDP
bind(fd1, ...); // Bind it to a local address
listen(fd1, ...); // Set it in listen mode
int fd2;
while ((fd2 = accept(fd1, ...)) != -1) // Accept an incoming connection
{
...communicate with client via fd2...
close(fd2); // When finished
}
close(fd1);
现在,当你得到fd2
时,它有一个套接字,它与的端口有一个不同的本地短暂端口(每个{更正) {3}})。无需将任何特定信息传达给客户; TCP / IP实现为您处理。客户端将有一个连接到fd1
连接到fd2
的套接字,其机器上的端口(可能是一个临时端口)连接到服务器和服务器的临时端口。
重点是完成的连接将具有唯一的4元组(客户端IP地址,客户端端口,服务器IP地址,服务器端口)。
当涉及到处理时,有各种方法来处理它。您可以使用迭代服务器在处理任何其他请求之前处理一个请求。或者,您可以使用两种不同的方式创建并发服务器。一种方法是使用线程服务器,其中线程(来自池,或为每个传入连接新创建)处理新请求,同时主线程返回以接受新传入请求。另一种方法是创建一个分叉服务器,主服务器进程分叉和子进程处理新连接,同时父进程关闭连接并返回监听下一个连接请求。