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

时间:2010-12-06 03:10:11

标签: c sockets tcp udp

我正在使用套接字API编写C语言中的服务器 - 客户端编程,我试图将控制信息发送到客户端以使用不同的TCP连接。 每当服务器创建新套接字(TCP)时,我希望它通知客户端使用新套接字进行进一步的通信。目前我已经考虑过将UDP数据包发送到客户端进行通知。一旦客户端收到数据包,它就会将ACK发送回服务器,同时切换到另一个TCP连接。 我想知道,除了使用UDP之外,还有更好的通过网络传输控制数据,因为它不可靠.Thnx

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

如果IPv6连接提供更好的性能,我需要告诉客户端切换到IPv6。在这种情况下,两个连接都是开放的,用于周期性地监视带宽以决定切换。所以我在这方面有两个问题。 1.一次保持两个连接是一个好主意。只有当我需要测量度量时才能创建另一个连接,因为两台机器之间的路径几乎不会改变。如果是,我可以使用控制信息传递另一个TCP连接告诉客户端切换。通过这种方式,我还可以测量带宽并通知客户端

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

1 个答案:

答案 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时,它有一个套接字,它与fd1连接到的端口有一个不同的本地短暂端口(每个{更正) {3}})。无需将任何特定信息传达给客户; TCP / IP实现为您处理。客户端将有一个连接到fd2的套接字,其机器上的端口(可能是一个临时端口)连接到服务器和服务器的临时端口。

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

当涉及到处理时,有各种方法来处理它。您可以使用迭代服务器在处理任何其他请求之前处理一个请求。或者,您可以使用两种不同的方式创建并发服务器。一种方法是使用线程服务器,其中线程(来自池,或为每个传入连接新创建)处理新请求,同时主线程返回以接受新传入请求。另一种方法是创建一个分叉服务器,主服务器进程分叉和子进程处理新连接,同时父进程关闭连接并返回监听下一个连接请求。