scoket 在linux下C语言怎么设置read超时

 我来答
受司大人
推荐于2016-01-10 · 知道合伙人影视综艺行家
受司大人
知道合伙人影视综艺行家
采纳数:20262 获赞数:171846
毕业于浙江广厦,有一定的电脑专业基础和两年工作经验,读过相关书籍多本

向TA提问 私信TA
展开全部
给你一段我写的client代码

  C/C++ code
  /*客户端*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<netdb.h> #include<netinet/in.h> #include<unistd.h> #include<sys/time.h> #include <errno.h> #define SERVERPORT 5556 int main(int argc,char *argv[]) { int sockfd,connectfd=0,recvfd,sendfd ; struct sockaddr_in serv_addr; struct hostent *host; FILE *fp; char ch[1024]; int byte_send=0; //int a=MSG_DONTWAIT; //int opt=MSG_DONTWAIT; fd_set rfds; struct timeval tv; int retval, maxfd; if(argc!=3) { printf("format: %s IP file_name\n",argv[0]); return 0; } if((host=(gethostbyname(argv[1])))==NULL) { printf("error in gethostby name. \n"); return 0; } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { printf("error in socket create.\n"); return 0; } printf("创建socket成功,sockfd=%d\n",sockfd); //printf("运行至此1\n"); serv_addr.sin_family=AF_INET; serv_addr.sin_port =htons(SERVERPORT); serv_addr.sin_addr=*((struct in_addr*)host->h_addr); bzero(&(serv_addr.sin_zero),sizeof(serv_addr.sin_zero)); //printf("运行至此2\n"); while(1) { if((connectfd=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr )))==-1) { printf("error in connect.\n"); printf("连接失败:connectfd=%d\n",connectfd); sleep(5); continue; } printf("连接成功:connectfd=%d\n",connectfd); break; } //printf("运行至此3\n"); fp=fopen(*(argv+2),"rb"); memset(ch,0,sizeof(ch)); while(1) { memset(ch,0,sizeof(ch)); sendfd=fread(ch,sizeof(char),1024,fp); if(sendfd<0) break; sleep(1); //printf("sendfd=%d\n",sendfd); byte_send=send(sockfd,ch,sendfd,0); //printf("byte_send=%d,%s\n",byte_send,strerror(errno)); //memset(&ch,0,sizeof(ch)); //printf("发送内容:%s\n",ch); sleep(3); while(1) { //void FD_ZERO (fd_set *fdset); // 初始化文件描述集合   //void FD_SET (int fd, fd_set *fdset); // 将描述符加入到集合中   //void FD_CLR (int fd, fd_set *fdset); // 将描述符中集合中删除   //int FD_ISSET (int fd, fd_set *fdset); // 检查描述符集合中指定的文件描述符是否可读写 /*把可读文件描述符的集合清空*/ FD_ZERO(&rfds); /*把标准输入的文件描述符加入到集合中*/ FD_SET(0, &rfds); maxfd = 0; /*把当前连接的文件描述符加入到集合中*/ FD_SET(sockfd, &rfds); /*找出文件描述符集合中最大的文件描述符*/ if(maxfd < sockfd) maxfd = sockfd; /*设置超时时间*/ tv.tv_sec = 5; tv.tv_usec = 0; /*等待聊天*/ retval = select(maxfd+1, &rfds, NULL, NULL, &tv); if(retval == -1) { printf("select出错,客户端程序退出\n"); break; } else if(retval == 0) { //printf("客户端没有任何输入信息,并且服务器也没有信息到来,waiting...\n"); //continue; printf("客户端输出信息完毕,等待下一次输出\n"); break; } else { /*服务器发来了消息*/ if(FD_ISSET(sockfd,&rfds))// 检查描述符集合中指定的文件描述符是否可读写 { /******接收消息*******/ memset(ch,0,sizeof(ch)); recvfd=recv(sockfd,ch,sizeof(ch),0); if(recvfd==-1) { //printf("运行至此7\n"); printf("error in recv.\n"); continue; } //printf("recvfd=%d\n",recvfd); printf("%s\n",ch); } } } } printf("传送结束!\n"); fclose(fp); close(connectfd); return 0; }
认不倒你
2015-02-16 · TA获得超过666个赞
知道小有建树答主
回答量:820
采纳率:50%
帮助的人:359万
展开全部
select ...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式