accpt函数调用出现Resource temporarily unavailable

aiyiqingyang 2012-05-31 06:18:40
#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函数呢?
百思不得其解啊
...全文
711 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-05-31
  • 打赏
  • 举报
回复
因为监听套接字被你设置为非阻塞了, 所以accept没有connection的时候立即返回了,错误码EAGAIN.

23,215

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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