我现在想用UDP连接来发送服务器上的文件给客户端,假设有很多客户端来请求,想用多线程实现:
用一个套结字(IP + 一个固定端口)负责接受客户端的请求,有客户端的请求后,重新分配一个新的端口号,并把这个端口告诉客户端(这个好实现),再在服务器上绑定这个端口,用这个端口和这个客户机进行通讯(发送数据和接受数据),请问这样行不行呢?????
bind(老端口号);
while(1)
{
nSize = recvfrom(socketbind,lpbuf,1024,0,(SOCK_ADDR *)&sockClient,..);
function(sockClient,lpbuf);
}
function(...)
{
sendto(....);//新端口号也发出去,这个由协议实现,告诉客户机和这个端口通讯
bind(新端口号);
recvfrom(...);
....
sendto(...);
}
用一个套结字(IP + 一个固定端口)负责接受客户端的请求,有客户端的请求后,重新分配一个新的端口号,并把这个端口告诉客户端(这个好实现),再在服务器上绑定这个端口,用这个端口和这个客户机进行通讯(发送数据和接受数据),请问这样行不行呢?????
bind(老端口号);
while(1)
{
nSize = recvfrom(socketbind,lpbuf,1024,0,(SOCK_ADDR *)&sockClient,..);
function(sockClient,lpbuf);
}
function(...)
{
sendto(....);//新端口号也发出去,这个由协议实现,告诉客户机和这个端口通讯
bind(新端口号);
recvfrom(...);
....
sendto(...);
}
bind()多次没什么意义。一个socket榜定多次,原来的就丢失了。应该是多个socket。每个socket榜定一次。
如果用UDP就不好使了,如何保证数据是正确的呢? 确认应答呢?如果要用UDP,建议在client做个listen socket,一直监听
要等sever的一个udp包传过来才能向下进行,但sever的包就是不过来,
这时有两种情况:
1.client 给 sever的包丢了
2.sever 回复 client的包丢了这下应该怎么处理呢?是不是要自己建立类似于三次握手的机制?
若是client超时重发,那sever端还要有处理重复包的机制,那岂不是很麻烦?你是怎么处理的?能讨论一下吗?
pack num
Total pack
file size(2048bytes)
checksum单线程单port
接收方收,如果有跳号,checksum err 就发Request command 要发送方resend.mutilthread ,多port,就麻烦一点。等对方发send over command.
while(1)
{
nSize = recvfrom(socketbind,lpbuf,1024,0,(SOCK_ADDR *)&sockClient,..);
function(sockClient,lpbuf);
}
function(...)
{
sendto(....);//新端口号也发出去,这个由协议实现,告诉客户机和这个端口通讯
bind(新端口号);
recvfrom(...);
....
sendto(...);
}
第二个recvfrom(...)接收不到客户端传来的数据报,怎么回事,是不是和阻塞有关???????
不过有必要用Udp么,校验要自个写的,这不是视频,音频,错了,就过
了。文件耶。