#110分 |
|
#2 |
回复1楼: |
#310分 |
回复2楼: 结贴是个号好习惯哦!亲 |
#4 |
回复3楼: 我还有问题啊。 如果是UDP的服务端,多客户端发送数据,服务端不考虑回复客户端。 需要使用select吧。因为如果直接recv的话,我感觉逻辑有问题啊 |
#510分 |
回复4楼: 是的! |
#6 |
因为recvfrom,我觉得没办法判断一个客户端的数据是否接收完成。
recvfrom(); //假设我设置1k的缓冲区,但是实际数据为1.5k,那么我就需要两次recv才可 //以完成接收动作,但是没办法确认每次不同客户端上行都需要几次 但是我使用 while(select() == TRUE) { recvfrom(); //这样我可以一次接收,只针对一个客户端的上行,没问题吧? } |
#7 |
刚查到资料说UDP并发select也不好,那我还是在研究研究。 先不结贴 |
#810分 |
回复6楼: udp是无序的,数据长了要分片。 针对多客户端发过来的udp,用select或者只用recvfrom都是可以的,只要在自己的包头中标志好相关信息,比如是否分片,属于哪个。 并不是说用了select就能自动保证一个客户端的上行了 |
#9 |
回复8楼: 是的,还是全部接收下来后在分析处理。 关了,谢谢两位了 |
#10 |
首先,对于listenfd,使用FD_SET加入到fdset中,
然后,使用一个数组connfds保存所有简历的socket fd, 最后,在服务端程序的main函数中,有个while循环,逻辑如下: while(true) { if(FD_ISSET(listenfd, fdset) { conn_fd = accept(…); connfds[i] = conn_fd; FD_SET(conn_fd, fdset); } for(遍历connfds数组) { if(FD_SET(connfds[I], fdset) { 唤醒线程池中的一个空闲线程; } } }
不知道上面的逻辑可以不? 谢谢 |
#11 |
上面的回复忘了加select调用,不好意思。
首先,对于listenfd,使用FD_SET加入到fdset中, 然后,使用一个数组connfds保存所有简历的socket fd, 最后,在服务端程序的main函数中,有个while循环,逻辑如下: while(true) { ret = select(….fdset); if(FD_ISSET(listenfd, fdset) { conn_fd = accept(…); connfds[i] = conn_fd; FD_SET(conn_fd, fdset); if(–ret <= 0) continue; } for(遍历connfds数组) { if(FD_SET(connfds[I], fdset) { 唤醒线程池中的一个空闲线程; } } }
不知道上面的逻辑可以不? 谢谢 |