非阻塞IO--fcntl

/*************************************************************************
	fcntl 实现非阻塞IO,这是UDP当客户端等待服务器返回数据
	3秒内无数据则视为超时

 ************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  

void main(int argc, char **argv)
{
    if(argc != 3)
    {
        perror("argc must be 3\n");
        return ;
    }
    int sockfd;
    struct sockaddr_in seraddr;
    char buf[128];
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket error\n");
        return ;
    }

    int flag;
    flag = fcntl(sockfd, F_GETFL, 0); //flag:文件描述词。F_GETFL :读取文件状态标志。
    flag |= O_NONBLOCK;// O_NONBLOCK 更改为非阻塞的标志
    fcntl(sockfd, F_SETFL, flag);//设置完成

    bzero(&seraddr, sizeof(seraddr));
    seraddr.sin_family = PF_INET;
    seraddr.sin_addr.s_addr = inet_addr(argv[1]);
    seraddr.sin_port = htons(atoi(argv[2]));
    if(connect(sockfd, (struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
    {
        perror("connect error\n");
        return ;
    }
    printf("\n");
    while(1)
    {
        printf("please input some data:\n");
        fgets(buf, 128, stdin);
        buf[strlen(buf)-1] = '\n';
        send(sockfd, &buf, sizeof(buf), 0);
        sleep(3);//模仿处理请求的时间
		//此时的recv不再为阻塞模式
        if(recv(sockfd, &buf, sizeof(buf), 0) > 0)
            printf("%s",buf);//有响应输出服务器回发的数据
		else
			printf("time out\n");//否则超时
    }

    close(sockfd);

}










你可能感兴趣的:(Linux,C)