基本的I/O复用(linux)

基本实现I/O复用功能,在本机上实现,IP地址一样,端口互相颠倒一下

  1. 代码
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#define BUFLEN 255
#define max(x,y) (((x)>(y))?(x):(y))
int main(int argc,char**argv)
{   struct sockaddr_in peeraddr,localaddr;
   int sockfd,n,maxfd,socklen;
   char msg[BUFLEN+1];
   fd_set infds;
   if(argc!=5)
   {  printf("%s<dest IP address><dest port><source IP address> <source port>\n",argv[0]);  
exit(1);
}   
sockfd=socket(AF_INET,SOCK_DGRAM,0);
   if(sockfd<0){
      fprintf(stderr,"socket creating error in udptalk.c\n");
      exit(1);
   }
   socklen=sizeof(struct sockaddr_in);
   memset(&peeraddr,0,socklen);
   peeraddr.sin_family=AF_INET;
   peeraddr.sin_port=htons(atoi(argv[2]));
   if(inet_pton(AF_INET,argv[1],&peeraddr.sin_addr)<=0){
     printf("wrong dest ip address\n");
     exit(0);
   }
memset(&localaddr,0,socklen);
   localaddr.sin_family=AF_INET;
   if(inet_pton(AF_INET,argv[3],&localaddr.sin_addr)<=0){
      printf("Wrong source IP address\n");
      exit(0);
   }
   localaddr.sin_port=htons(atoi(argv[4]));
   if(bind(sockfd,(struct sockaddr *)&localaddr,socklen)<0){
      fprintf(stderr,"bind local address error in udptalk.c\n");
      exit(2);
   }
   connect(sockfd,(struct sockaddr*)&peeraddr,socklen);
   for(;;)
   {
FD_ZERO(&infds);
      FD_SET(fileno(stdin),&infds);
      FD_SET(sockfd,&infds);
      maxfd=max(fileno(stdin),sockfd)+1;
if(select(maxfd,&infds,NULL,NULL,NULL)==-1)
      {
         fprintf(stderr,"select error in udptalk.c\n");
         exit(3);
      }
      if(FD_ISSET(sockfd,&infds))
       {
         n=read(sockfd,msg,BUFLEN);
         if((n==-1)||(n==0)){
            printf("peer closed\n");
            exit(0);
           }
else   {
           msg[n]=0;
           printf("peer:%s",msg);
          }
 }
 if(FD_ISSET(fileno(stdin),&infds))
        {
         if(fgets(msg,BUFLEN,stdin)==NULL){
            printf("talk over!\n");
            exit(0);
          }
         write(sockfd,msg,strlen(msg));
         printf("sent:%s",msg);
        }    
   }
}
  1. 运行结果
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值