2010-12-06 89 views
0

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

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

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

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

+1

服务器在切换之前如何与客户端进行通信?他们是否已经有一个现有的TCP连接?也许你应该更多地解释架构 - 这个问题留下了很多想象。 如果你已经有了一个开放的TCP连接,你可以使用它进行通信。如果你正在和一个你以前没有见过的新客户交谈过,UDP可能会工作,但是为了应对不可靠性,考虑等待ACK,如果没有在几秒钟内收到,重新发送它。 – mgiuca 2010-12-06 03:16:18

+1

听起来像重新实现FTP协议? – 2010-12-06 03:45:58

回答

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连接到(根据EJP更正)的端口的本地临时端口。没有必要将任何特定信息传回给客户; TCP/IP实现为您处理。客户端将有一个连接到fd2的套接字,其连接到服务器的端口(可能是短暂端口)和服务器的临时端口。

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

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