1. 程式人生 > >網路通訊,實現客戶端和伺服器端的通訊

網路通訊,實現客戶端和伺服器端的通訊

      write(new_fd,buf,strlen(buf));
    }
    }else{
      perror("fork");
    }
}
int main(int argc,char *argv[]){
    if(argc!=3){
       printf("Usage ./server[ip][port]\n");
       return 1;
    }
    signal(SIGCHLD,SIG_IGN);
    int fd=socket(AF_INET,SOCK_STEAM,0);
    if(fd<0){
       perror("socket");
       return 1;
    }
    sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_addr.s_addr=inet_addr(argv[1]);
    addr.sin_port=htons(atoi(argv[2]));
    int ret=bind(fd,(sockaddr *)&addr,sizeof(addr));
    if(ret<0){
       perror("bind");
       return 1;
    }
    ret=listen("fd,5);
    if(ret<0){
       perror("listen");
       return 1;
   }
 }
   while(1){
      sockaddr_in peer;
      socklen_t len=sizeof(peer);
//
      int new_fd=accept(fd,(sockaddr *)&peer,&len);
      if(new_fd<0){
         perror("accept");
         continue;
      }
//accept完成之後,建立子程序。讓父程序能夠快速的再次呼叫到accept,等待第二個客戶端的連線,讓子程序來處理當前這個連線的讀寫。
      ProcessConnect(new_fd);
   }
   return 0;
}
2.多執行緒伺服器端
# include<stdio.h>
# include<stdlib.h>
# include<sys/socket.h>
# include<unistd.h>
# include <netinet/in.h>
# include <arpa/inet.h>
typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;
void *ThreadEntry(void *ptr)
{
    Arg *arg=(Arg *)ptr;
    while(1){
       char buf[1024]={0};
       ssize_t read_size=read(arg->new_fd,buf,sizeof(buf)-1);
       if(read_size<0){
          perror("read");
          continue;
       }
       if(read_size==0){
          printf("client %s:%d diconnected",inet_ntoa(arg->peer.sin_addr),ntohs(arg->peer.sin_port));
       close(arg->new_fd);
       free(arg);
       return NULL;
       }
    buf[read_size]='\0';
      printf("client %s:%d say:%s\n",inet_nyoa(arg->peer.sin_addr),ntohs(arg->peer.sin_port),buf));
     write(arg->new_fd,buf,strlen(buf));
}
  return nULL;
  }