2014-11-05 6 views
0

동일한 컴퓨터에서이 클라이언트와 서버 프로그램을 연결하는 방법 USB를 통해 Linux env를 사용하고 있습니까? 터미널 두 개를 열어야합니까 ?? 둘째로 나는 "이미 사용 ADRESS"자신에게 포트 번호를 그주는 오류를 제공 얼마나 내 호스트 이름이 친절 단계에서 이야기 "우분투"입니다 나는이 오류를 방지 할 수 있고 나는 동일한 시스템에 그들을 어떻게 컴파일 할 수 있습니다서버와 클라이언트를 연결하는 것

   /* 
      ** server.c -- a stream socket server demo 
      */ 

      #include <stdio.h> 
      #include <stdlib.h> 
      #include <unistd.h> 
      #include <errno.h> 
      #include <string.h> 
      #include <sys/types.h> 
      #include <sys/socket.h> 
      #include <netinet/in.h> 
      #include <netdb.h> 
      #include <arpa/inet.h> 
      #include <sys/wait.h> 
      #include <signal.h> 

      #define PORT "3490"  // the port users will be connecting to 

      #define BACKLOG 10 // how many pending connections queue will hold 

      void sigchld_handler(int s) 
      { 
       while(waitpid(-1, NULL, WNOHANG) > 0); 
      } 

      // get sockaddr, IPv4 or IPv6: 

      void *get_in_addr(struct sockaddr *sa) 
      { 
       if (sa->sa_family == AF_INET) 
       { 
        return &(((struct sockaddr_in*)sa)->sin_addr); 
       } 

        return &(((struct sockaddr_in6*)sa)->sin6_addr); 
      } 

      int main(void) 
      { 
       int sockfd, new_fd;      // listen on sock_fd, new connection on new_fd 
       struct addrinfo hints, *servinfo, *p; 
       struct sockaddr_storage their_addr;  // connector's address information 
       socklen_t sin_size; 
       struct sigaction sa; 
       int yes=1; 
       char s[INET6_ADDRSTRLEN]; 
       int rv; 

       memset(&hints, 0, sizeof hints); 
       hints.ai_family = AF_UNSPEC; 
       hints.ai_socktype = SOCK_STREAM; 
       hints.ai_flags = AI_PASSIVE;    // use my IP 

       if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) 
       { 
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
        return 1; 
       } 

       // loop through all the results and bind to the first we can 

       for(p = servinfo; p != NULL; p = p->ai_next) 
       { 
        if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1) 
        { 
         perror("server: socket"); 
         continue; 
        } 

        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int)) == -1) 
        { 
         perror("setsockopt"); 
         exit(1); 
        } 

        if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) 
        { 
         close(sockfd); 
         perror("server: bind"); 
         continue; 
        } 

        break; 
       } 

       if (p == NULL) 
       { 
        fprintf(stderr, "server: failed to bind\n"); 
        return 2; 
       } 

       freeaddrinfo(servinfo); // all done with this structure 

       if (listen(sockfd, BACKLOG) == -1) { 
        perror("listen"); 
        exit(1); 
       } 

       sa.sa_handler = sigchld_handler; // reap all dead processes 
       sigemptyset(&sa.sa_mask); 
       sa.sa_flags = SA_RESTART; 
       if (sigaction(SIGCHLD, &sa, NULL) == -1) { 
        perror("sigaction"); 
        exit(1); 
       } 

       printf("server: waiting for connections...\n"); 

       while(1) 
        { 
         // main accept() loop 

         sin_size = sizeof their_addr; 
         new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); 
         if (new_fd == -1) 
         { 
         perror("accept"); 
         continue; 
         } 

         inet_ntop(their_addr.ss_family,get_in_addr((struct sockaddr *)&their_addr),s, sizeof s); 
         printf("server: got connection from %s\n", s); 

         if (!fork()) 
         { 
         // this is the child process 

         close(sockfd); // child doesn't need the listener 
         if (send(new_fd, "Hello, world!", 13, 0) == -1) 
         perror("send"); 
         close(new_fd); 
         exit(0); 
         } 
          close(new_fd); // parent doesn't need this 
       } 

       return 0; 
      } 

답변

0

두 개의 터미널을 엽니 다. 하나는 서버 프로세스입니다. 다른 하나는 로컬 호스트 (주로 127.0.0.1)를 사용하고 동일한 포트 번호를 제공하는 클라이언트를 실행하는 것입니다. 터미널에서 이미 서버 프로그램을 실행 한 다음 동일한 터미널 프로그램에서 동일한 서버 프로그램을 다시 실행하려면 이미 사용중인 포트 주소를 사용해야합니다. 터미널을 닫고 새 터미널을 열면됩니다.

관련 문제