2012-10-01 3 views
0

프로젝트에서 C로 기본 클라이언트/서버 시스템을 만들려고합니다. 나는 아래 아이디어의 기초를 가지고있다. 나는 서버가 kill 시그널을 보낼 때까지 무한히 실행되는 나의 클라이언트에서 while 루프를 가진다. 나는 독서/작문 블록입니다. 나는 서버에서 작업 할 수있는 첫 번째 읽기/쓰기를 얻을 수 있었지만 나중에는 작동하지 않습니다.C에서 소켓 프로그램을 루프하는 방법

나는 소켓에 뭔가 잘못하고 있다고 확신한다. 클라이언트가 다른 write() 명령을 보낼 때까지 서버가 대기하도록하려는 것입니다. 여기 서버/클라이언트가 무엇을 :

클라이언트

short connected = 1; 
    do 
    { 
      // Send initial request on first pass 
      // Afterwards send the resposne we were given 
      n = write(sockfd, buffer, strlen(buffer)); 
      if (n < 0) 
        error("Failed to send messege. Terminating."); 
      printf("%s\n", buffer); 
      // Any errors? 
      if (strcmp(buffer, "Session key does not match. Terminating.") == 0) 
        error(buffer); 

      // Get session key response 
      bzero(buffer, BUFFER_LENGTH); 
      n = read(sockfd, buffer, BUFFER_LENGTH); 
      if (n < 0) 
        error("Could not fetch result. Terminating."); 

      printf("%s\n", buffer); 
      sleep(1); 
    } while (connected == 1); 

서버 내가 읽기() 블록이 될 때까지 서버 코드를 중지 사실을 발견 의견에

sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0) 
{ 
     printf("Error opening socket.\n"); 
     exit(0); 
} 

// Taken from reference 
bzero((char *) &serv_addr, sizeof(serv_addr)); 
portNumber = atoi(argv[1]); 
serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = INADDR_ANY; 
serv_addr.sin_port = htons(portNumber); 
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
{ 
     printf("ERROR on binding.\n"); 
     close(sockfd); 
     exit(0); 
} 

// Add listner to socket and wait until we are given something to do 
// Taken from reference 
listen(sockfd, 5); 
clilen = sizeof(cli_addr); 
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 
if (newsockfd < 0) 
{ 
     printf("ERROR on accept.\n"); 
     close(sockfd); 
     exit(0); 
} 

// Get initial session key request 
bzero(buffer,BUFFER_LENGTH); 
n = read(newsockfd, buffer, BUFFER_LENGTH); 
if (n < 0) 
{ 
     printf("ERROR reading from socket.\n"); 
     close(newsockfd); 
     close(sockfd); 
     exit(0); 
} 

// ... a bunch of processing of data 

n = write(newsockfd, response, lengthOfKey + 15 + 1); 
if (n < 0) 
{ 
     printf("ERROR writing to socket.\n"); 
     close(newsockfd); 
     close(sockfd); 
     exit(0); 
} 

close(newsockfd); 

// Get the previous key(s) now (we hope) 
short connected = 1; 
while (connected < 100) 
{ 
     printf("waiting...\n"); 
     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 

     //... more processing 
} 
+0

"더 많은 처리"가 아래쪽에 무엇인지 확실하지 않지만 위와 동일해야합니다. 너가 너를 위에 동일한 재료를하고 싶으면 다만 루프에서 모두 시작해야한다. – CrazyCasta

+0

첫 번째 read()와 두 번째 read()는 동일하지 않지만 두 번째 accept() 후에 계속 진행되는 것 같지 않습니다 (일명 b4 처리가 더 많음) – MasterGberry

+0

다시 연결하지 않았으므로 계속하지 않을 가능성이 높습니다. 고객. 하지만 통신을 계속하려면 왜 연결을 닫아야합니까? –

답변

0

감사합니다 write()를 통해 클라이언트로부터 무언가가 주어진다. 모든 작업 :) 감사합니다

관련 문제