socket select问题

whutcl8110 2009-09-03 04:49:55
int listen_id,accep_id; //监听socket,传输socket
int n;
static int currentid = 0;
int fd[MAXCLIENT];
int i,j;
char buffer[BUF_SIZE];
struct sockaddr_in serveraddr,clientaddr; //客户端地址

fd_set rd; //在这儿定义一个保存可读的fd_set

for(i = 0;i < MAXCLIENT;i++)
{
fd = -1;
}

//创建监听socket
listen_id = socket(AF_INET,SOCK_STREAM,0);
if(listen_id < 0)
{
fprintf(stderr,"Create listen socket failure.\n");
exit(1);
}

//设置监听socket
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(PORT);

//绑定socket
if(bind(listen_id,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
{
fprintf(stderr,"bind listen socket failure.\n");
exit(1);
}

//监听socket
if(listen(listen_id,MAXCLIENT)<0)
{
fprintf(stderr,"listen the socket failure.\n");
}

//并发处理连接
FD_ZERO(&rd);

int nfds = 0; //将该值放到循环外来定义
while(1)
{
int ret;
nfds = max(nfds,listen_id);
FD_SET(listen_id,&rd);

ret = select(nfds+1,&rd, NULL, NULL, NULL);
if(ret<0)
{
continue;
}
else
{
怎么判断是accept还是recv?
}

}
...全文
160 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq51931375 2009-09-05
  • 打赏
  • 举报
回复
一楼说的对 连接都没建立 就谈不上recv
就只能accept
feiyangdn 2009-09-04
  • 打赏
  • 举报
回复
while(1)
{
.....
nfds = max(nfds,listen_id);
FD_SET(listen_id,&rd);

ret = select(nfds+1,&rd, NULL, NULL, NULL);
.....
}
select的第二个参数是表示可读的意思,触发条件有三种情况,有客户端连接,有数据可读,连接断开。
可以根据FD_ISSET判断哪一个Socket有事件发生,如果是监听的socket事件则是客户端连接请求,如果是连接客户端的socket则是有数据可读,连接断开情况应该可以根据socket的状态来判断,没用过。
用FD_ISSET可以判断是哪个socket有事件发生,如果是监听的那个socket(listen_id)则Accept应该会返回成功,如果不是就是开始处理recv的情况。
你后面的程序应该重置rd,把Accept成功的连接客户端的socket保存起来并全部添加到rd中
Conry 2009-09-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 whutcl8110 的回复:]
连接都没建立起来,哪里的recv啊?

这是服务器端的
后面的代码还没写,呵呵,自己学习,没搞明白

select里面的fd_set既是输入参数,也是输出参数,可以根据fd_set的返回判断事件,你这程序有问题
select之后要重置fd_set

是不是根据FD_ISSET()返回值判断
msdn上没说明白
返回什么的时候是accept,recv


[/Quote]
if(FD_ISSET(listen_id,&rd))
{
accept(...)
}
stjay 2009-09-03
  • 打赏
  • 举报
回复

要分开select
不要混在一起select
stjay 2009-09-03
  • 打赏
  • 举报
回复
listen的那个socket只用于accept,不会有recv的
accept后返回的那个socket才有send和recv

就是同一socket不会同时存在accept和recv,
至少现在的socket模型没
Sou2012 2009-09-03
  • 打赏
  • 举报
回复
帮顶!!!
whutcl8110 2009-09-03
  • 打赏
  • 举报
回复
连接都没建立起来,哪里的recv啊?

这是服务器端的
后面的代码还没写,呵呵,自己学习,没搞明白


select里面的fd_set既是输入参数,也是输出参数,可以根据fd_set的返回判断事件,你这程序有问题
select之后要重置fd_set

是不是根据FD_ISSET()返回值判断
msdn上没说明白
返回什么的时候是accept,recv

feiyangdn 2009-09-03
  • 打赏
  • 举报
回复
select里面的fd_set既是输入参数,也是输出参数,可以根据fd_set的返回判断事件,你这程序有问题
select之后要重置fd_set
feiyangdn 2009-09-03
  • 打赏
  • 举报
回复
都有可能
feiyangdn 2009-09-03
  • 打赏
  • 举报
回复
连接都没建立起来,哪里的recv啊?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧