将下面的 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);