我现在想用UDP连接来发送服务器上的文件给客户端,假设有很多客户端来请求,想用多线程实现:
用一个套结字(IP + 一个固定端口)负责接受客户端的请求,有客户端的请求后,重新分配一个新的端口号,并把这个端口告诉客户端(这个好实现),再在服务器上绑定这个端口,用这个端口和这个客户机进行通讯(发送数据和接受数据),请问这样行不行呢?????
bind(老端口号);
while(1)
{
 nSize = recvfrom(socketbind,lpbuf,1024,0,(SOCK_ADDR *)&sockClient,..);
function(sockClient,lpbuf);
}
function(...)
{
sendto(....);//新端口号也发出去,这个由协议实现,告诉客户机和这个端口通讯
bind(新端口号);
recvfrom(...);
....
sendto(...);
}

解决方案 »

  1.   

    我想知道在服务器上bind()多次行吗?当然只是IP相同而端口号不同
      

  2.   

    使用tcp好些,用一个listen port, 收到请求后,new a udp port,客户端用bind, 把客户端做服务器。这样不至于要在服务器段固定port.
      

  3.   

    没什么不可以的,如果你愿意,你还可以在UDP的基础上实现完整的TCP。不过如果让我选的话,有TCP可用就不会这么费劲用UDP的。btw:
    bind()多次没什么意义。一个socket榜定多次,原来的就丢失了。应该是多个socket。每个socket榜定一次。
      

  4.   

    一般的文件传输采用TCP更合适些,TCP有重传机制的,
    如果用UDP就不好使了,如何保证数据是正确的呢? 确认应答呢?如果要用UDP,建议在client做个listen socket,一直监听
      

  5.   

    协议已经定好了,就是用UDP,因为有速度要求,UDP比较快
      

  6.   

    这个有现存的协议, 叫uftp,源代码网上应该有.直接拿来用,或者你可以参考
      

  7.   

    楼主,我比较关心的是你用udp时的重传机制,就是说,万一client发一个包给sever
    要等sever的一个udp包传过来才能向下进行,但sever的包就是不过来,
    这时有两种情况:
    1.client 给 sever的包丢了
    2.sever 回复 client的包丢了这下应该怎么处理呢?是不是要自己建立类似于三次握手的机制?
    若是client超时重发,那sever端还要有处理重复包的机制,那岂不是很麻烦?你是怎么处理的?能讨论一下吗?
      

  8.   

    自己定义packet
    pack num
    Total pack
    file size(2048bytes)
    checksum单线程单port
    接收方收,如果有跳号,checksum err 就发Request command 要发送方resend.mutilthread ,多port,就麻烦一点。等对方发send over command.
      

  9.   

    bind(老端口号);
    while(1)
    {
     nSize = recvfrom(socketbind,lpbuf,1024,0,(SOCK_ADDR *)&sockClient,..);
    function(sockClient,lpbuf);
    }
    function(...)
    {
    sendto(....);//新端口号也发出去,这个由协议实现,告诉客户机和这个端口通讯
    bind(新端口号);
    recvfrom(...);
    ....
    sendto(...);
    }
    第二个recvfrom(...)接收不到客户端传来的数据报,怎么回事,是不是和阻塞有关???????
      

  10.   

    听得好像有点项ftp协议,客户连一下,商量一个新的端口,在连接。
    不过有必要用Udp么,校验要自个写的,这不是视频,音频,错了,就过
    了。文件耶。
      

  11.   

    这就是视频,音频节目文件,传输还有点问题,发送的速度较慢,不知有什么办法提高socket发送和接收的速度?????