1、使用Linux的select网络模型 01和02 一起是全部代码
while(1)
{
printf("\n----please wait new connect and start to talk----\n");
len = sizeof(struct sockaddr);
if((new_fd=accept(sockfd, (struct sockaddr *)&their_addr, &len))==-1)
{
perror("accept");
exit(1);
}
else
{
printf("server:got connection from %s, port %d, socket %d\n", inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port),new_fd);
}
printf("\n start to talk with, please clik enter keyboard");
while(1)
{
FD_ZERO(&rfds);
FD_SET(0, &rfds);
maxfd=0;
FD_SET(new_fd, &rfds);
if(new_fd>maxfd)
{
maxfd=new_fd;
}
tv.tv_sec=1;
tv.tv_usec=0;
retval=select(maxfd+1,&rfds,NULL,NULL,&tv);
if(retval==-1)
{
printf("error to select , will to leave! %s", strerror(errno));
break;
}
else if (retval==0)
{
printf("no message ,and no put keyboard , still to wait\n");
continue;
}else{
if(FD_ISSET(0, &rfds))
{
bzero(buf, MAXBUF+1);
fgets(buf, MAXBUF, stdin);
if(!strncasecmp(buf, "quit", 4))
{
printf("user to exit!\n");
break;
}
len=send(new_fd,buf,strlen(buf)-1,0);
if(len>0)
{
printf("success to send, send %d bytes!\n",buf,len);
}
else
{
printf("failed to send message, errno is %d, errmessage is %s\n", buf, errno, strerror(errno));
break;
}
}
if(FD_ISSET(new_fd, &rfds))
{
bzero(buf, MAXBUF+1);
len=recv(new_fd, buf,MAXBUF,0);
if(len>0)
{
printf("success to recv message : %s, get %d bytes\n", buf, len);
}
else
{
if(len<0)
{
printf("failed to recv message, errorno is %d, error message is %s\n", errno,strerror(errno));
}
else
{
printf("another have to leave, stop to talk\n");
}
break;
}
}
}
}
close(new_fd);
printf("if you want to still talk , no to stop");
fflush(stdout);
bzero(buf, MAXBUF + 1);
fgets(buf, MAXBUF, stdin);
if (!strncasecmp(buf, "no", 2))
{
printf("stop to talk!\n");
break;
}
}
close(sockfd);
return 0;
}