繁体   English   中英

在C中的套接字编程中在客户端-服务器之间传递控制信息

[英]Passing control information between client-server in socket programming in C

我正在使用套接字API在C中为服务器-客户端编程进行编码,在该示例中,我试图将控制信息发送给客户端以使用不同的TCP连接。 每当服务器创建新的套接字(TCP)时,我都希望它通知客户端使用新的套接字进行进一步的通信。目前,我已经考虑过向客户端发送UDP数据包以进行通知。 客户端收到数据包后,它将ACK发送回服务器,同时切换到另一个TCP连接。 我想知道,除了使用UDP之外,还有一种更好的方法可以通过网络在网络上通信控制数据。

我想详细说明我要达到的目标。 我将测量诸如带宽,等待时间,接收窗口等参数,作为Ipv4和IPv6 TCP连接的度量。 根据观察到的性能,我将在提供更好性能的两个协议之间进行切换。一旦做出切换决定,我必须通知合作伙伴(可能是客户端或服务器,基于我正在测量上载,下载的带宽类型) 。 我从IPv4连接开始,同时打开另一个连接-IPv6,用于测量带宽和延迟。

如果IPv6连接提供更好的性能,则需要告诉客户端切换到IPv6。 在这种情况下,两个连接都是开放的,用于定期监视带宽以决定切换。 因此,我对此有两个疑问。 1,一次保持两个连接是一个好主意,只有在需要测量指标时才可以创建另一个连接,因为两台机器之间的路径几乎不变,如果可以,我可以使用另一个TCP连接告诉客户端进行切换。 这样我也可以测量带宽并通知客户端

两个有两个TCP连接不是一个好主意,我可以使用UDP发送控制信息。 我避免在用于传输实际数据的conn上发送控制信息,因为这将增加开销。 我的代码就像传输数据的中间件一样工作,应用程序将调用我的函数/宏来传输数据,内部代码将负责测量带宽并决定切换。我希望我能清楚想要实现。 感谢您的提前反馈

服务器端侦听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 ,该插座的套接字fd1所连接的端口具有不同的本地临时端口 (根据EJP 进行更正)。 无需将任何特定信息传达回客户端; TCP / IP实施将为您解决。 客户端将具有一个连接到fd2的套接字,该套接字在其计算机上的一个端口(可能是临时端口)连接到服务器,并且该服务器的临时端口与服务器连接。

关键是完成的连接将具有唯一的4元组(客户端IP地址,客户端端口,服务器IP地址,服务器端口)。

当涉及到处理时,有多种处理方法。 您可以使用迭代服务器来处理一个请求,然后再处理其他请求。 或者,您可以通过两种不同方式之一创建并发服务器。 一种方法是使用线程服务器,其中线程(来自池,或为每个传入连接新创建)处理新请求,而主线程返回以接受新传入请求。 替代方法是创建一个派生服务器,其中主服务器进程进行分叉,子进程处理新连接,而父进程关闭该连接并返回侦听下一个连接请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM