免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2431 | 回复: 6
打印 上一主题 下一主题

关于select函数,急!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-22 17:41 |只看该作者 |倒序浏览
关于select函数的用法不是很清楚,尤其是什么时候套接口可读?可写?
以下是一段服务器代码,想要通过客户端的connect使得sockfd可读,但是没有成功:)
那位高手帮忙解决一下
server 端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define PORT 3241
#define LOG 10
#define MAXLEN 100
main(int argc,char **argv)
{
        struct timeval tv;
        fd_set readfd;
        int sockfd,newfd,sin_size;
        pid_t pid;
        struct sockaddr_in ser_addr,cli_addr;
        sin_size=sizeof(struct sockaddr_in);
        sockfd=socket(AF_INET,SOCK_STREAM,0);//创建套接口
        ser_addr.sin_family=AF_INET;
        ser_addr.sin_port=htons(PORT);
        ser_addr.sin_addr.s_addr=INADDR_ANY;
        bzero(&(ser_addr.sin_zero),;
        bind(sockfd,(struct sockaddr *)&ser_addr,sin_size);//邦定
        listen(sockfd,LOG);监听
        tv.tv_sec=1;
        tv.tc_usec=0;
if(select(sockfd,&readfd,NULL,NULL,&tv)>0)//等待套接口可读
{//未执行!!!!!!!!!!!!why???
        newfd=accept(sockfd,(struct sockaddr *)&cli_addr,&sin_size);
pid=fork();
if(!pid)
{//子进程,发送消息
         printf("send message now!\n";
         send(newfd,argv[1],MAXLEN,0);
         close(newfd);
         exit(0);
}
}
close(newfd);
wait(NULL);
}

client端:
#include<stdio.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<errno.h>
#include<sys/socket.h>
#define MYPORT 3240
main()
{
        int sockfd,numbytes;
        char buf[100];
        struct sockaddr_in server_addr;
        sockfd=socket(AF_INET,SOCK_STREAM,0);//创建套接口
        printf("sockfd is %d\n";
        server_addr.sin_family=AF_INET;
        server_addr.sin_port=htons(MYPORT);
        server_addr.sin_addr.s_addr=inet_addr("202.112.146.28";//202.112.146.28是server地址
  bzero(&server_addr.sin_zero,;
        connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct soc
kaddr));//发起连接
        numbytes=recv(sockfd,buf,100,0);//接受
        buf[numbytes]=0;
        printf("receive string is %s\n",buf);
        close(sockfd);
}

论坛徽章:
0
2 [报告]
发表于 2006-09-22 22:44 |只看该作者
你的readfd没有初始化,FD_SET, FD_ISSET这一系列函数,去查查资料吧。

论坛徽章:
0
3 [报告]
发表于 2006-09-23 14:45 |只看该作者

回复 2楼 jonasan 的帖子

感谢楼上的回复。是我漏写了:)这次把原程序复制过来,希望指点一下,还是不行:)如下:(server)
server 端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define PORT 3241
#define LOG 10
#define MAXLEN 100
main(int argc,char **argv)
{
        struct timeval tv;
        fd_set readfd;
        int sockfd,newfd,sin_size;
        pid_t pid;
        struct sockaddr_in ser_addr,cli_addr;
        sin_size=sizeof(struct sockaddr_in);
        sockfd=socket(AF_INET,SOCK_STREAM,0);//创建套接口
        ser_addr.sin_family=AF_INET;
        ser_addr.sin_port=htons(PORT);
        ser_addr.sin_addr.s_addr=INADDR_ANY;
        bzero(&(ser_addr.sin_zero),;
        bind(sockfd,(struct sockaddr *)&ser_addr,sin_size);//邦定
        listen(sockfd,LOG);监听
        tv.tv_sec=1;
        tv.tc_usec=0;
FD_SET(sockfd,&readfd);
if(select(sockfd,&readfd,NULL,NULL,&tv)>0)//等待套接口可读
{//未执行!!!!!!!!!!!!why???
        newfd=accept(sockfd,(struct sockaddr *)&cli_addr,&sin_size);
pid=fork();
if(!pid)
{//子进程,发送消息
         printf("send message now!\n";
         send(newfd,argv[1],MAXLEN,0);
         close(newfd);
         exit(0);
}
}
close(newfd);
wait(NULL);
}

论坛徽章:
0
4 [报告]
发表于 2006-09-26 11:26 |只看该作者
tv.tv_sec=1;
        tv.tc_usec=0;
时间到 select返回

论坛徽章:
0
5 [报告]
发表于 2006-09-27 21:35 |只看该作者
FD_ZERO(&readfd)
FD_SET(sockfd,&readfd)

whiel(1)
{

if(select(sockfd,&readfd,NULL,NULL,&tv)<0)
{
  perror("select");
}
else if(FD_ISSET(sockfd,&readfd)
{
//在这里才可以读
}

}
我只说了你最主要的问题,你的程序问题比较多,你应该去看一下《UNIX环境高级编程》上的例子

[ 本帖最后由 showboy 于 2006-9-27 21:36 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-09-29 01:16 |只看该作者
补充一点:
client端connect的port应该和server端bind的port一致。

论坛徽章:
0
7 [报告]
发表于 2006-10-09 10:45 |只看该作者
if(select(sockfd,&readfd,NULL,NULL,&tv)>0)//等待套接口可读
-----改成
if(select(sockfd+1,&readfd,NULL,NULL,&tv)>0)//等待套接口可读
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP