如何从服务器端区分客户端使用的是 TCP 还是 UDP
我正在编写简单的客户端-服务器程序。
客户端使用 UDP 或 TCP 向服务器发送一些消息。服务器必须能够同时支持 UDP 和 TCP。
如果客户端使用UDP发送消息,则客户端中的方法调用顺序为socket(),bind(),sendto(),recvfrom(),close()
,服务器中的方法调用顺序为socket ()、bind()、sendto()、recvfrom()、close()
。
如果使用TCP, 服务器中的调用顺序是 socket()、bind()、listen()、accept()、send()、recv()、close()
。 在客户端中是 socket(),bind(),connect(),send(),recv(),close()
在我的程序中,用户/客户端在开始时就可以选择他想要使用的内容UDP 或 TCP。所以,我的主要问题是如何在服务器端知道或区分客户端是否使用 TCP 或 UDP 发送消息。如果它使用TCP,我必须调用listen(),accept(),send(),recv() 如果它使用UDP,我不会调用listen()、accept(),而是调用sendto()和recvfrom()。
那么,我如何在一开始就区分/知道这一点,以便我可以进行适当的函数调用。
谢谢。
I am writing simple client-server program.
Client send some messages to server using UDP or TCP. Server must be able to support both UDP and TCP.
If client, sends message using UDP, sequence of method calls in client is socket(),bind(),sendto(),recvfrom(),close()
and that in server is socket(),bind(),sendto(),recvfrom(),close()
.
If it uses TCP,
sequence of call in server issocket(),bind(),listen(),accept(),send(),recv(),close()
.
and that in client issocket(),bind(),connect(),send(),recv(),close()
In my program, user/client is given choice in the start to select what he want to use UDP or TCP. So, my main problem is how can I know or differentiate in the server side, if the client is sending message using TCP or UDP. If it uses TCP, I must call listen(),accept(),send(),recv()
and if it uses UDP, I don't call listen(),accept() but call sendto() and recvfrom().
So, how can I differentiate/know this in the beginning so that I can make appropriate function calls.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在数据包到达您之前,您不知道它是
UDP
还是TCP
。因此,如果您希望同时请求两种方式,则需要绑定到
UDP
和TCP
套接字。一旦你这样做了,你就知道它是通过你接收数据包的套接字来的。
Before the packet reaches you, you don't know whether it's
UDP
orTCP
.So you want to bind to both
UDP
andTCP
sockets if you expect requests both ways.Once you did, you just know which way it came by the socket you received the packet through.
创建套接字时,您传递一个类型 -
SOCK_STREAM
(TCP) 或SOCK_DGRAM
(UDP),因此这两种流量将位于两个不同的套接字上。
When you create the socket, you pass a type -
SOCK_STREAM
(TCP) orSOCK_DGRAM
(UDP)So the two kinds of traffic will be on two different sockets.
正如 Henry Troup 指出的那样,IP 套接字被定义为
(传输、接口、端口)。
(UDP, 127.0.0.1, 80) 与 (TCP, 127.0.0.1, 80) 不是同一个 IP 套接字,因此您可以安全地绑定到它们两者并侦听传入流量。
Just as Henry Troup pointed out, an IP socket is defined as
(transport, interface, port).
(UDP, 127.0.0.1, 80) is not the same IP socket as (TCP, 127.0.0.1, 80) , thus you can safely bind to both of them and listen for incoming traffic.
只需让 TCP 套接字侦听端口 X,并通过端口 Y 进行 UDP 连接
just let the TCP socket listen on port X, and do the UDP connections through port Y