当前位置: 技术问答>linux和unix
socket编程多端口问题?
来源: 互联网 发布时间:2016-04-06
本文导语: 我想请教一下如何在socket编程中如何采用select检测两个端口的描述符,并对描述符分别调用不同的处理函数。 我目前想到的方法是建立两个socket,分别bind和listen,并加入select描述符集中,分别检测,并将两个描述符的...
我想请教一下如何在socket编程中如何采用select检测两个端口的描述符,并对描述符分别调用不同的处理函数。
我目前想到的方法是建立两个socket,分别bind和listen,并加入select描述符集中,分别检测,并将两个描述符的连接请求分别存入两个数组,然后分别对数组的描述符循环处理。流程如下:
sock_1 = socket(..);
sock_2 = socket(..);
bind(sock_1,..);
bind(sock_2,..);
listen( sock_1,..);
listen( sock_2,..);
FD_SET( sock_1, &readfd);
FD_SET( sock_2, &readfd);
while( 1 ) {
select( maxfd+1, &readfd,....);
if( FD_ISET( sock_1, &readfd ) ) {
newsock = accept(..)
cliA_sock[ii] = newsock;
FD_SET( cliA_sock[ii], &readfd )
}
if( FD_ISET( sock_2, &readfd ) ) {
newsock = accept(..)
cliB_sock[ii] = newsock;
FD_SET( cliB_sock[ii], &readfd )
}
for(...){
处理cliA_sock[ii]中所有描述符
}
for(...){
处理cliB_sock[ii]中所有描述符
}
}
但是这种流程有一个问题,就是收集描述符的两个数组,所收集描述符的个数很难控制,因为select描述符集合只能存放1024位,如果sock_1一下子收集了1000个述符并用FD_SET放入描述符集合中,那sock_2无论收集多少,也只能将24个FD_SET到描述符集合中。
请教一种好的流程,能解决不同的端口发来的请求进行不同的处理,重要是做好对两种描述符的管理,希望还是用select,谢谢!
我目前想到的方法是建立两个socket,分别bind和listen,并加入select描述符集中,分别检测,并将两个描述符的连接请求分别存入两个数组,然后分别对数组的描述符循环处理。流程如下:
sock_1 = socket(..);
sock_2 = socket(..);
bind(sock_1,..);
bind(sock_2,..);
listen( sock_1,..);
listen( sock_2,..);
FD_SET( sock_1, &readfd);
FD_SET( sock_2, &readfd);
while( 1 ) {
select( maxfd+1, &readfd,....);
if( FD_ISET( sock_1, &readfd ) ) {
newsock = accept(..)
cliA_sock[ii] = newsock;
FD_SET( cliA_sock[ii], &readfd )
}
if( FD_ISET( sock_2, &readfd ) ) {
newsock = accept(..)
cliB_sock[ii] = newsock;
FD_SET( cliB_sock[ii], &readfd )
}
for(...){
处理cliA_sock[ii]中所有描述符
}
for(...){
处理cliB_sock[ii]中所有描述符
}
}
但是这种流程有一个问题,就是收集描述符的两个数组,所收集描述符的个数很难控制,因为select描述符集合只能存放1024位,如果sock_1一下子收集了1000个述符并用FD_SET放入描述符集合中,那sock_2无论收集多少,也只能将24个FD_SET到描述符集合中。
请教一种好的流程,能解决不同的端口发来的请求进行不同的处理,重要是做好对两种描述符的管理,希望还是用select,谢谢!
|
是我糊涂,呵呵。
用结构,类似
{
int fd;
int type;
};
然后定义一个结构数组,动态的也行,匹配到fd后,根据type进行处理,如何?
用结构,类似
{
int fd;
int type;
};
然后定义一个结构数组,动态的也行,匹配到fd后,根据type进行处理,如何?
|
select 阻塞等待到超时或者readfd中的某一个有响应,在你这里就是sock1或sock2中的任意一个有accept,这样你就不是先sock1在sock2,而是两个同时收集,共同使用。
就你的意思,是像区分来自于两个不同的地方的SOCKET,需要把两种不同的SOCKET在同一个函数或进程中实现,给你两点建议:
1、使用多进程,一个进程处理sock1,一个进程处理sock2,这样就可以分开处理了。
2、仍然用你的方法,把accept后的套接字分别记载到两个数组中,然后如果有新的请求发生,那么先获取到请求的套接字描述符s,再分别到两个数组中去查找这个描述符是属于那个数组的,从而调用不同的处理函数。
有关socket编程多端口的详细内容你可以看下《精通Unix编程与项目实践》的第17章,《并发SOCKET程序设计》部分,上面有更加详细的例子。
就你的意思,是像区分来自于两个不同的地方的SOCKET,需要把两种不同的SOCKET在同一个函数或进程中实现,给你两点建议:
1、使用多进程,一个进程处理sock1,一个进程处理sock2,这样就可以分开处理了。
2、仍然用你的方法,把accept后的套接字分别记载到两个数组中,然后如果有新的请求发生,那么先获取到请求的套接字描述符s,再分别到两个数组中去查找这个描述符是属于那个数组的,从而调用不同的处理函数。
有关socket编程多端口的详细内容你可以看下《精通Unix编程与项目实践》的第17章,《并发SOCKET程序设计》部分,上面有更加详细的例子。