accpt函数调用出现Resource temporarily unavailable
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<time.h>
#include<netdb.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#define BUFFSIZE 512
//错误处理函数
static void bail(const char *on_what)
{
fputs(strerror(errno),stderr);
fputs(":",stderr);
fputs(on_what,stderr);
fputc('\n',stderr);
exit(1);
}
//服务器主函数
int main(int argc,char *argv[])
{
int z; //读取的字符个数
int socketfd,newsocket; //套接字定义
struct sockaddr_in server_addr;
struct sockaddr_in client_addr; //服务器和客户端的地址
socklen_t size;
int portnumber; //端口号
char reqbuf[BUFFSIZE]; //接收缓存
char dtbuf[BUFFSIZE]; //目标缓存
time_t td; //本机的时间
struct tm tm_1; //另一种形式的时间
//如果运行时输入的形式错误时
if(argc!=2)
{
fprintf(stderr,"usage:%s potnumber\a\n",argv[0]);
exit(1);
}
if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"usage:%s potnumber\a\n",argv[0]);
exit(1);
}
memset(&server_addr,0,sizeof server_addr); //将一段内存变为0
if((socketfd=socket(PF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"socket error:%s \a\n",strerror(errno));
exit(1);
}
//设置非阻塞套接字
int opts=fcntl(socketfd,F_GETFL);
if(opts<0)
bail("fcntl");
opts=opts|O_NONBLOCK;
if(fcntl(socketfd,F_SETFL,opts))
bail("fcntl2");
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY); //主机字节序改成网络字节序,并监听任意一个IP地址
server_addr.sin_port=htons(portnumber); //将主机字节序的端口号改成网络字节序
//绑定套接字与地址
if((bind(socketfd,(struct sockaddr *)(&server_addr),sizeof(server_addr)))==-1)
{
fprintf(stderr,"bind error :%s\a\n",strerror(errno));
exit(1);
}
//printf("地址转换后的大小");
//监听套接字
if(listen(socketfd,128)==-1)
{
fprintf(stderr,"listen error:%s\a\n",strerror(errno));
exit(1);
}
printf("等待客户端的请求11");
//主循环程序,从套接字中读取数据,每次只能有一个连接,
while (1)
{
size=sizeof(struct sockaddr_in);
//接收一个链接
if((newsocket=accept(socketfd,(struct sockaddr *)(&client_addr),&size))==-1)
{
fprintf(stderr,"accept error :%s\a\n",strerror(errno));
exit(1);
}
fprintf(stdout,"server got connection from %s\n",inet_ntoa(client_addr.sin_addr));
//从连接中去数据,一个循环,直到取完全
for(;;)
{
z=read(newsocket,reqbuf,sizeof(reqbuf));
if(z<0)
bail("read()");
if(z==0)
{
close(newsocket);
break;
}
reqbuf[z]=0; //数组最后加上NULL
time(&td);
tm_1=*localtime(&td);
strftime(dtbuf,sizeof(dtbuf),reqbuf,&tm_1);
z=write(newsocket,dtbuf,strlen(dtbuf));
if(z<0)
bail("write");
}
}
}
这是一个简单的服务器程序,服务器接收到客户端时间请求后,把自己的时间发给客户端,服务器套接字设为非阻塞模式,运行时显示如下两行:
accept error :Resource temporarily unavailable
等待客户端的请求11
然而程序就终止了,请问这里为什么先执行了accpt函数再执行while(1)之前的printf函数呢?
百思不得其解啊