用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

非阻塞socket在accept使用的一个例子

2012-10-23 作者: osdba举报

[c]代码库

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#include <strings.h>
#include <errno.h>

int main (int argc,char * argv[])
{
    int servfd,clifd;
    struct sockaddr_in servaddr,cliaddr;

    if((servfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        printf("Create socket error!\n");
        return -1;
    }
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(5000);
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY); //inet_addr("192.168.0.1");

    int option=1;
    setsockopt(servfd,SOL_SOCKET,SO_REUSEADDR,(char *)&option,sizeof(option));
    struct linger li;
    li.l_onoff=1;
    li.l_linger=1;
    setsockopt(servfd,SOL_SOCKET,SO_LINGER,(char *)&li,sizeof(li));
    if(bind(servfd,(struct sockaddr * )&servaddr,sizeof(servaddr))<0)
    {
        perror("bind to port 5000 failure");
        return -1;
    }
    if(listen(servfd,10)<0)
    {
        perror("listen error");
        return -1;
    }

    int flags = fcntl(servfd, F_GETFL, 0);
    fcntl(servfd, F_SETFL, flags | O_NONBLOCK);

    while(1)
    {
        socklen_t len;
        len=sizeof(cliaddr);
        clifd=accept(servfd,(struct sockaddr *)&cliaddr,&len);
        if(clifd < 0)
        {
            if (errno==EAGAIN || errno == EWOULDBLOCK)
            {
                usleep(10000);
                continue;
            }
            else
            {
                perror("call accept error");
                break;
            }
        }
        char szIp[17];
        bzero(szIp,17);
        inet_ntop(AF_INET,&cliaddr.sin_addr,szIp,16);
        printf("from client IP:%s,Port:%d\n",szIp,ntohs(cliaddr.sin_port));
        char buf[256];
        time_t t;
        time(&t);
        int datalen=sprintf(buf,"Server:%u\n",(unsigned int)t);
        send(clifd,buf,datalen,0);
        close(clifd);
    }
    close(servfd);
    return 0;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...