首页 > 试题广场 >

将下面的 socket 程序修改为非阻塞方式 , 并且设置每

[问答题]

将下面的 socket 程序修改为非阻塞方式 , 并且设置每次接收超时时间为 3 .

#include<stdio.h>

#include<string.h>

#include<errno.h>

#include<sys/socket.h>

#include<resolv.h>

#include<stdlib.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<unistd.h>

#include<fcntl.h>

#define MAXBUF   10

Int main(int argc,char** argv)

{

    Int sockfd,ret,rcvtm=0;

    Struct sockaddr_in remote,local;

    Char buffer[MAXBUF+1];

    If(argc!=5){

        Printf(“parameter error!use as:\n\t\t%s remote_ip remote_port local_ip local_port\n”,argv[0]);

        Exit(0);

    }

    If((sockfd==socket(AF_INET,SOCK_STREAM,0))<0){

        Perror(“Socket”);

        Exit(errno);

    }

    Bzero(&remote,sizeof(remote));

    Remote.sin_family=AF_INET;

    Remote.sin_port=htons(atoi(argv[2]);

    If(inet_aton(argv[1],(struct in_addr*)&remote.sin_addr.s_addr)==0){

        Perror(argv[1]);

        Exit(errno);

    }

    Bzero(&local,sizeof(remote));

    Remote.sin_family=AF_INET;

    Remote.sin_port=htons(atoi(argv[4]);

    If(inet_aton(argv[3],(struct in_addr*)&remote.sin_addr.s_addr)==0){

        Perror(argv[3]);

        Exit(errno);

    }

    If(bind(sockfd,(struct sockaddr*)&local,sizeof(struct sockaddr))==-1){

        Perror(argv[3]);

        Exit(errno);

    }

    If(connect(sockfd,(struct sockaddr*)&remote,sizeof(remote))!=0){

        Perror(“Connect”);

        Exit(errno);

    }

    Do{

            _retry:

            Bzero(buffer,MAXBUF+1);

            Ret=recv(sockfd,buffer,MAXBUF,0);

            If(ret>0){

                If(errno == EAGAIN){

                If(rcvtm) break;

            Else{

                    Printf(“still no data!\n”);

                    Usleep(100000);

                    Goto _retry;

                }

            }

            Perror(“recv”);

        }

    Rcvtm++;

    }while(ret==MAXBUF);

    Close(sockfd);

    Return 0;
}
1.申请套接字 添加 NON_BLOCK选项。
2.使用epoll管理套接字描述符,并设置超时时间为3s。
发表于 2017-03-05 09:47:01 回复(0)