select连接问题~ 有点一直搞不明白~
************************* 引用 **********************************
使用select后我们的服务器程序就变成了.
初始话(socket,bind,listen);
while(1)
{
设置监听读写文件描述符(FD_*);
调用select;
如果是倾听套接字就绪,说明一个新的连接请求建立 //?我们只能判断可读
//如果可读怎么知道是
//一个新的连接还是客户来的数据呢
{
建立连接(accept);
加入到监听文件描述符中去;
}
否则说明是一个已经连接过的描述符
{
进行操作(read或者write);
}
}
**********************************************************************
我现在是在做多个客户与服务器连接~
在服务器端~ 首先在主函数里不停的监听srvSock套接口~
如果有客户连接那么我再创建一个服务线程~专门为这个客户服务~
main()
{
timevalue tv = {0,0};
while(1)
{
cout < < "wait client to connect.... " < < endl;
if( select(srvSock+1, NULL, NULL, &tv ) > 0 )
{
if( FD_ISSET(srvSock, &readSet) )
{
int newSock = accept(...);
cout < < "newSock = " < < newSock < <endl;
pthread_create( serviceThread, newSock );
}
}
else
{
cout < < "no client to connect! " < <endl;
}
}
}
问题: 有个客户端软件在不停的尝试连接我这个服务器~ 当我启动服务器时~
一下子与客户端建立了两个连接~ 打印信息大致如下:
wait client to connect.....
newSock = 4
.............
............
wait client to connect.....
newSock = 5
请问怎么解决一个客户多次连接这个问题~ 先谢了~
[解决办法]
接收连接的套接字和读写数据的套接字不是同一个.
看来你还不明白网络连接的过程啊.
server
socket //创建一个套接字.
bind //绑定一个地址
listen //设为设为服务端.
accept //接收连接
if(等到连接)
新建立一个连接套接字,用这个套接字和这个连接读写数据 //一般这里都是fork一个新进程.
else 继续等待连接
回到上边,继续等待其他连接.
//----------------等待连接和读写数据不是用的同一个套接字,也不是用的同一个函数调用.
clent
socket //创建一个套接字.
bind //绑定一个地址
connect //连接到服务器
开始读写数据.