关注分享主机优惠活动
国内外VPS云服务器

如何在Linux下实现选择异步通信

大部分人对这篇文章“Linux下如何实现select异步通信”的知识点不是很理解,所以主机频道为你总结了以下内容,内容详细,步骤清晰,有一定的参考价值。希望你看完这篇文章能有所收获。我们来看看这篇文章《Linux下如何实现选择异步通信》。

1.服务器端

/* select _ server . c 2011 . 9 . 2 by yyg */
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & lt错误号& gt
# include & ltstring.h & gt
# include & ltsys/types . h & gt;
# include & ltnetinet/in . h & gt;
# include & ltsys/socket . h & gt;
# include & ltsys/wait . h & gt;
# include & ltpthread.h & gt
# include & ltsys/wait . h & gt;
# include & ltsys/time . h & gt;
# include & ltarpa/inet . h & gt;
# include & ltunistd.h & gt

#定义MAXBUF 1024

int main(int argc,char **argv){
int sockfd,new _ fd
socklen _ t len
struct sockaddr_in my_addr,their _ addr
无符号int myport,lisnum
char buf[max buf+1];
fd _ set rfds
struct timeval(argv[1]){
my port = atoi(argv[1]);
}
其他
myport = 7838

if(argv[2]){
lis num = atoi(argv[2]);
}
其他
lis num = 2;
if((sockfd = socket(PF_INET,SOCK_STREAM,0))== -1){
perror(& quot;插座& quot);
出口(1);
}

bzero(& amp;my_addr,sizeof(my _ addr));
我的_地址. sin _家庭= PF _ INET
my _ addr . sin _ port = htons(my port);
if(argv[3])
my _ addr . sin _ addr . s _ addr = in addr _ ANY;

if(bind(sockfd,(struct sockaddr *)& amp;my_addr,sizeof(struct sockaddr)) == -1){
perror(& quot;绑定& quot);
出口(1);
}

if(listen(sockfd,lis num)=-1){
perror(& quot;听着& quot);
出口(1);
}

while(1){
printf(& quot;\n -等待新连接开始新字符-\ n & quot;);
len = sizeof(struct sockaddr);
if((new_fd = accept(sockfd,(struct sockaddr *)& amp;他们的地址。len)) == -1){
perror(& quot;接受& quot);
退出(errno);
}
其他
printf(& quot;服务器:从%s,端口%d,套接字%d获得连接\ n & quot,\
inet_ntoa(他们的地址. sin _地址),\
ntohs(their_addr.sin_port),new _ FD);

/*在每个新连接上开始处理数据传输和接收*/
//printf(& quot;\n -准备好了。现在您可以聊天了...输入回车,然后就可以聊天了-\ n & quot;);
while(1){
/*清空集合*/
FD_ZERO。rfds);
/*将标准输入句柄0添加到集合*/
FD _ SET(0 & amp;rfds);
maxfd = 0;
/*将当前连接句柄new_fd添加到集合*/
FD_SET(new_fd,& amprfds);
if(new _ FD & gt;maxfd)
maxfd = new _ fd
/*设置最长等待时间*/
TV . TV _ sec = 1;
TV . TV _ usec = 0;

retval = select(maxfd+1,& amprfds,NULL,NULL & amp;电视);
if(retval == -1){
printf(& quot;选择错误!% s \ n & quot,strerror(errno));
打破;
}
else if(retval == 0){
//printf(& quot;没有消息,用户没有按下按钮,请等待...\ n & quot);
继续;
}
否则{

if(FD_ISSET(new_fd,& amprfds)){
/*在连接的套接字上接收和显示消息*/
bzero(buf,max buf+1);
/*接收对方发来的消息,最多MAXBUF字节*/
len = recv(new_fd,buf,MAXBUF,0);
if(len & gt;0)
printf(& quot;接收消息成功:%s!%d字节。\ n & quot,buf,len);
否则{
if(len & lt;0){
printf(& quot;接收消息失败,错误号是:%d,错误信息是%s。,errno,strerror(errno));
}
其他
printf(& quot;不干了。\ n & quot);
打破;
}
}// FD_ISSET = sockfd情况
if(FD_ISSET(0,& amprfds)){
/*如果用户有输入,读取其内容并发送*/
bzero(buf,max buf+1);
fgets(buf,MAXBUF,stdin);
如果(!strncacecmp(buf,& quot退出& quot, 4)){
printf(& quot;自己请求退出聊天\ n & quot);
打破;
}
/*向服务器发送消息*/
len = send(new_fd,buf,strlen(buf)-1,0);
if(len & lt;0){
printf(& quot;媒体:%s发送失败!错误号是:%d,错误信息是:% s \ n & quot,buf,errno,strerror(errno));
打破;
}否则{
printf(& quot;消息:%s\t发送成功,发送%d字节!\ n & quot,buf,len);
}
}//FD_ISSET = 0

}//选择处理结束

}/*当*/
close(new _ FD);
/*每个新连接的数据发送和接收处理结束*/
printf(& quot;你想和另一个人聊天吗?(否->;退出)& quot);
fflush(stdout);
bzero(buf,max buf+1);
fgets(buf,MAXBUF,stdin);
如果(!strncacecmp(buf,& quot不& quot,2)){
printf(& quot;停止聊天!\ n & quot);
打破;
}

}/*外部while*/

关闭(sockfd);
返回0;
}2.客户

/* select _ client . c 2011 . 9 . 2 by yyg */
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & lt错误号& gt
# include & ltstring.h & gt
# include & ltsys/types . h & gt;
# include & ltnetinet/in . h & gt;
# include & ltsys/socket . h & gt;
# include & ltsys/wait . h & gt;
# include & ltpthread.h & gt
# include & ltsys/time . h & gt;
# include & ltarpa/inet . h & gt;
# include & ltunistd.h & gt
# include & ltresolv.h & gt

#定义MAXBUF 1024
int main(int argc,char **argv){
int sockfd,len
struct sockaddr _ in dest
char buf[max buf+1];
fd _ set rfds
struct timeval(argc!= 3){
printf(& quot;参数样式错误!\ n & quot);
退出(0);
}
/*为tcp通信创建套接字*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0))& lt;0){
perror(& quot;插座& quot);
退出(errno);
}

/*初始化服务器(对方)的地址和端口信息)*/
bzero(& amp;dest,sizeof(dest));
dest.sin _ family = AF _ INET
dest . sin _ port = htons(atoi(argv[2]);
if(inet_aton(argv[1],(struct in _ addr *)& amp;dest . sin _ addr . s _ addr)= 0){
perror(argv[1]);
退出(errno);
}

/*连接到服务器*/
if(connect(sockfd,(struct sockaddr *)& amp;dest,sizeof(dest))!=0){
perror(& quot;连接& quot);
退出(errno);
}

printf(& quot;\n -准备好聊天...-\ n & quot;);
while(1){
/*清空集合*/
FD_ZERO。rfds);
/*将标准输入句柄0添加到集合*/
FD _ SET(0 & amp;rfds);
maxfd = 0;
/*将当前连接句柄套接字添加到集合中*/
FD _ SET(sockfd & amp;rfds);
if(sockfd & gt;maxfd)
maxfd = sockfd
/*设置最长等待时间*/
TV . TV _ sec = 1;
TV . TV _ usec = 0;
/*开始等待*/
retval = select(maxfd+1,& amprfds,NULL,NULL & amp;电视);
if(retval == -1){
printf(& quot;选择错误,退出!\ n & quot);
打破;
}else if(retval == 0){
继续;
}否则{
if(FD_ISSET(sockfd,& amprfds)){
/*在连接的套接字上接收和显示消息*/
bzero(缓冲区,max buf+1);
/*接收对方发来的消息,最多MAXBUF字节*/
len = recv(sockfd,buffer,MAXBUF,0);
if(len & gt;0)
printf(& quot;接收消息成功:%s!%d字节。\ n & quot缓冲区、透镜);
否则{
if(len & lt;0){
printf(& quot;接收消息失败,错误号是:%d,错误信息是%s。,errno,strerror(errno));
}
其他
printf(& quot;不干了。\ n & quot);
打破;
}
}// FD_ISSET = sockfd情况
if(FD_ISSET(0,& amprfds)){
/*如果用户有输入,读取其内容并发送*/
bzero(缓冲区,max buf+1);
fgets(buffer,MAXBUF,stdin);
如果(!strncacecmp(buffer,& quot退出& quot, 4)){
printf(& quot;自己请求退出聊天\ n & quot);
打破;
}
/*向服务器发送消息*/
len = send(sockfd,buffer,strlen(buffer)-1,0);
if(len & lt;0){
printf(& quot;媒体:%s发送失败!错误号是:%d,错误信息是:% s \ n & quot,buffer,errno,strerror(errno));
打破;
}否则{
printf(& quot;消息:%s\t发送成功,发送%d字节!\ n & quot缓冲区、透镜);
}
}//FD_ISSET = 0

}//选择处理结束

}//处理聊天的while循环。
/*关闭连接*/
关闭(sockfd);
返回0;
}运行结果:

终端1:服务器端

[root@localhost net]#。/select_server 7838

-等待新连接启动新字符-
服务器:从172.31.100.236获得连接,端口59462,socked 4
recv消息成功:kfldsjfk!8字节rcv。
456354
消息:456354
发送成功,发送6字节!
接收消息成功:453455!6字节rcv。终端2:客户端

[root@localhost net]#。/select _ client 172 . 31 . 100 . 236 7838

-准备好聊天了...-
kfldsjfk
消息:kfldsjfk
发送成功,发送8字节!
接收消息成功:456354!6字节rcv。
453455
消息:453455
发送成功,发送6字节!

未经允许不得转载:主机频道 » 如何在Linux下实现选择异步通信

评论 抢沙发

评论前必须登录!