用WinSock编程,使用UDP协议是有一些困惑!
大家都知道TCP的Client和Server的分工是非常的明确的,Server首先在一个端口监听Client请求,
然后Accept请求,最后建立连接,Server分配一个新的端口通信,Server依旧使用原来的端口监听。Client一直就是请求建立连接然后通信。他们的行为是相当的明确和不同的。
UDP不需要建立连接,那么Server和Client的工作各是什么?Server和Client的工作有什么不同之处和相同之处?由于不需要建立连接,Server难道只使用一个端口和所有的Client通信吗?

解决方案 »

  1.   

    server必须要bind端口
    client不一定要bindServer难道只使用一个端口和所有的Client通信吗
    =============
    是的, 具体是哪一个client端,可以从recvfrom函数中获得.
      

  2.   

    UDP一个端口就可以与任意数量的用户进行通信,它既是Server也是Client.
      

  3.   

    UDP是个广播协议,不面向客户的进行消息发送
    就好像电台的播音,你可以用收音机调到相同的波段去接收,也可以不去理会
      

  4.   

    udp没有明显的server和client概念,对于tcp其实也一样,只是一个被动一个主动,server也可以主动连接client的,只是berkeley socket不支持它udp不论server和client,其实都需要bind,只是使用sendto函数时,操作系统发现如果此socket还没有绑定,则自动绑定
      

  5.   

    楼上说既是Server也是Client,那么为什么Server需要Bind而Client不需要?
      

  6.   

    >> Server难道只使用一个端口和所有的Client通信吗?
    -----
    是的,Client也一样。server和client没啥区别。
      

  7.   

    client和server的区别我想就在于谁是主动发请求的吧!
    dns服务http服务等等都是这样的(木马好象有点不同)。
    既然是被动接受请求的,那么服务端口就必须是固定的,否则客户端怎么进行连接呢?对于baojian的话:是的,Client也一样。server和client没啥区别。
    我就不太明白什么意思!可能想叉了!
      

  8.   

    “Client也一样”:Client也可以只使用一个端口和多个Server通信
      

  9.   

    >>dns服务http服务等等都是这样的(木马好象有点不同)。
    ---
    木马也是一样,包括所谓的反弹端口木马。
      

  10.   

    那Client为什么不需要指定端口?
      

  11.   

    如果udp客户端只发送数据不接收返回数据就不需要bind
    如果要接收服务器发送的返回的数据也需要bind,要不然服务器不知道该往哪里发送
      

  12.   

    addr.sin_family = AF_INET;
    addr.sin_port = htons(5150);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(s,(sockaddr *)addr,sizeof(addr));以上的代码是什么意思?
    为什么端口是本机的,ip确是发送端的ip
      

  13.   

    addr.sin_family = AF_INET;
    addr.sin_port = htons(5150);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(s,(sockaddr *)addr,sizeof(addr));以上的代码是什么意思?
    为什么端口是本机的,ip确是发送端的ip设置此socket用来接收5150端口发送来得数据。只有这样你才可以使用recv进行被动接收数据
    addr.sin_addr.s_addr = htonl(INADDR_ANY);<<-- 是任意地址
      

  14.   

    你这好像应该是服务器的代码吧!
    addr.sin_port = htons(5150);服务器通信端口addr.sin_addr.s_addr = htonl(INADDR_ANY); 指定的通信地址是任意地址
    好像对于UDP来说还真没多大C/S的区别
      

  15.   

    为什么有些书中,把IP地址叫做网络接口或IP接口?
    如果这样 addr.sin_addr.s_addr = 本机地址;
    会有什么效果?
      

  16.   

    一个socket是由ip和端口组成的,当你建立一个udp的socket的时候,你需要绑定一个port,其实实质上就是用来监听,尽管udp没有这个概念。然后用一个udp的客户端向这个所谓的服务端发送数据报,这个服务端读到这个数据包并且能够从这个数据包中得知对端的ip和port,这就是为什么客户端不需要绑定端口,因为系统会分配给它一个端口,但是server不同它必须指定一个端口,否则client往谁发?
      

  17.   

    原则上,不论tcp、udp,不论server、client,在进行网络收发包之前,都需要bind(指定本地IP和端口)如果你没有显式调用bind函数,udp在第一次调用sendto时,系统就会自动帮你绑定(随机分配一个本地端口,一般大于1024,并且下层网络驱动开始分配缓冲)
      

  18.   

    addr.sin_family = AF_INET;
    addr.sin_port = htons(5150);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(s,(sockaddr *)addr,sizeof(addr));为什么端口是指定本机的端口,ip确是发送端的ip,
    我可以把这句去掉吗?addr.sin_addr.s_addr = htonl(INADDR_ANY);
      

  19.   

    端口和IP都是本地的。
    不能去掉。If an application does not care what local address is assigned, specify the manifest constant value ADDR_ANY for the sa_data member of the name parameter. This allows the underlying service provider to use any appropriate network address, potentially simplifying application programming in the presence of multihomed hosts (that is, hosts that have more than one network interface and address).
      

  20.   

    udp应该没有认server或是client的,p2p通信不就是2个client的通信吗?没有什么分别的,我用控件的时候更是直接server连接server,不用client控件的
      

  21.   

    udp既然是无连接,那么还管他是s还是c,不是吗?
      

  22.   

    Client和Server的区别是一个是请求服务,一个是提供服务。提供服务的当然要提供一个固定的端口来接受所需的服务请求,因此需要显式绑定(bind),来监听提供服务的端口。Client端请求服务,本不需要绑定,但是因为需要接收服务的返回,还是需要绑定,即使没有显式绑定,但是在调用sendto函数之后还是会绑定一个临时端口。Server并不一定只用一个端口和客户端通信。在需要处理并发服务请求的服务器上,通常会在接收到服务请求之后,创建一个临时套接口,并与客户端进行通信。详细的情况可以看看Unix网络编程卷一中的UDP编程,上面说的很详细。
      

  23.   

    udp无所谓server和client,只是简单地可以在某个IP/port上recvfrom数据包,也可以简单地sendto一个数据包给某个IP/port接收时用的IP一般是INADDR_ANY,代表接收所有发送到本机上所拥有的所有IP地址的某个port的数据包,发送时一般要指定发送到哪个IP地址和port,在发送时你可以做bind,也可以不做
      

  24.   

    SHIT!!!!!!!!!!!!!!!!!!!!!!!!!!
    楼上的回答都是SHIT!TCP跟UDP的Bind都是在处理一件事情, 就是绑定相应的本地端口. TCP有面向连接的, 所以他需要一个Accept过程, 把对方的地址和端口连接一下.UDP是不可靠服务, 所以它的传输速度要高一下. UDP不是像上面所说的是广播协议, 这样说纯属扯淡. UDP跟TCP的区别是TCP在传输数据完成后, 要等对方发送回来ACK报文才能确认这次的传输成功了. UDP没有这一过程, 发送完数据就没事了. 针对你的问题, 可以这样想一下, UDP 的Client端由于没有绑定本地端口, 所以它发送数据时可以随意切换端口.UDP的SERVER端当然只能听一个端口. 跟TCP没有区别. 能拿到所有UDP报文的是在IP层处理里. 跟应用层没有关系.看你的意思, 可能你是不理解端口的概念. 端口在实现应用中是用于区分进程(或者线程)的. 是不是TCP的端口搅浑了????? 以为端口是区分一条连接的????阅读一下<<TCP/IP详解>>卷一, 这些问题都不是问题.