2013-06-21 5 views
-3

소켓 프로그래밍을 사용하여 C 언어에 대한 할당을 알고 있습니다. 내가 요청한 것은 SELECT() 함수 (FORK() 함수가 아닌)를 사용하여 TCP 서버를 작성하는 것입니다.) 서버는이 서버에 연결된 클라이언트가 제공 한 N 개의 숫자의 합계를 caculate해야합니다. 서버는 내가 이미 TCP 서버가있는 N 가장 큰 숫자와 클라이언트가 터미널tcp 서버에서 숫자를 계산하는 방법

에서 텔넷 서비스를 서버에 연결이 번호 를 보내 클라이언트의 IP 주소를 인쇄해야하지만 난 방법을 잘 모릅니다 고객이 보내는 번호를 받으십시오. 도움을 주셔서 감사합니다.

+0

'man select'을 사용해 보셨습니까? – Shark

+0

클라이언트도 작성해야합니까? 그렇다면 숫자를 보내려 고 시도한 것은 무엇입니까? 클라이언트를 작성하지 않았다면 서버의 값이 recv() 될 메시지의 형식에 대한 설명을 받았습니까? –

+0

클라이언트를 작성하지 않아도 standart telnet으로 연결합니다. 하지만 연결하는 모든 클라이언트 나에게 몇 가지 번호를 보내고 배열 (이 N)에 넣어 다음 다른 클라이언트가 다른 번호를 보내려면 최대 번호를 계산 그래서 만약 최대가 변경되지 않은 경우 다시 확인해야합니다 –

답변

1

텔넷 서버를 사용하려면 소켓을 포트 번호에 바인딩해야합니다. 표준 텔넷 포트는 23입니다. 서버 부분이 이미 있으므로 클라이언트가 서버에 연결합니다. 번호를 읽는 부분을 보내 드리겠습니다. 복사하여 프로그램에 붙여 넣으십시오. 그것을 사용하기 위해서는 accept에서 얻은 소켓으로 ProcessConnection() 함수를 호출하면됩니다.

// Some "special" characters definitions 
#define RETURN 13 
#define NEWLINE 10 
#define ESCAPE 27 
#define BACKSPACE 8 

// this is the max numbers that can be accepted per session 
// you may change to do it dynamically, pointers and malloc, case you want to. 
#define MAX_NUMS 250 
int theNumbers[MAX_NUMS]; 

// To do the echo of remote typed chars 
int doEcho = 0; 

// return the sum of the Int theNumbers 
int sumThemUp(int count) 
{ 
    int sum=0, i=0; 
    for (i=0; i < count; i++) sum+=theNumbers[i]; 
    return sum; 
} 

// return the biggest number 
int getBiggest(int count) 
{ 
    int ret=0, i=0; 
    for (i=0; i < count; i++) 
     if (ret < theNumbers[i]) ret = theNumbers[i]; 
    return ret; 
} 

// return the smallest number 
int getSmallest(int count) 
{ 
    int ret=0, i=0; 
    for (i=0; i < count; i++) 
     if (ret == 0 || ret > theNumbers[i]) ret = theNumbers[i]; 
    return ret; 
} 

void ProcessConnection(SOCKET wConSock) 
{ 
    fd_set sfds; 
    struct timeval timeout={0, 0}; 
    char actNum[12]; 
    int numNums=0; 
    char ch; 

    char * WelcomeMessage1 = "Welcome to my telnet emulator\r\n"; 
    char * WelcomeMessage2 = "Please type in a number and press enter\r\n"; 
    char * WelcomeMessage3 = "To end the session press the Esc key\r\n"; 
    char * WakeUpMessage = "Are you sleeping?, common wake up!!\r\n"; 
    int sentSleep=0; 

    send(wConSock, WelcomeMessage1, strlen(WelcomeMessage1), 0); 
    send(wConSock, WelcomeMessage2, strlen(WelcomeMessage2), 0); 
    send(wConSock, WelcomeMessage3, strlen(WelcomeMessage3), 0); 
    memset(actNum, 0, sizeof(actNum)); 
    memset(theNumbers, 0, sizeof(int) * MAX_NUMS); 

    int KeepOnReading = 1; 
    while (KeepOnReading) 
    { 
     FD_ZERO(&sfds); 
     FD_SET(wConSock, &sfds); 
     timeout.tv_sec=60; // 1 minute 
     timeout.tv_usec=0; 

     switch (select(1, &sfds, NULL, NULL, &timeout)) 
     { 
      default: 
       // there are errors in the socket, close it and quit 
       close(wConSock); 
       return; 

      case 0: // time out has elapsed 
       if (!sentSleep) send(wConSock, WakeUpMessage, strlen(WakeUpMessage), 0); 
       sentSleep=1; 
       break; 

      case 1: // socket has data, let's read it 
       if (recv(wConSock, &ch, sizeof(ch), 0) == sizeof(ch)) 
       { // got a char, let's see it 
        switch (ch) 
        { 
         case '0': 
         case '1': 
         case '2': 
         case '3': 
         case '4': 
         case '5': 
         case '6': 
         case '7': 
         case '8': 
         case '9': 
          if (strlen(actNum) < 10) strncat(actNum, &ch, 1); 
          if (doEcho) send(wConSock, &ch, sizeof(ch), 0); 
          sentSleep=0; 
          break; 

         case BACKSPACE: 
          if (strlen(actNum)) actNum[strlen(actNum)-1] = '\0'; 
          if (doEcho) send(wConSock, "\b", 1, 0); 
          break; 

         case ESCAPE: // Esc 
          KeepOnReading=0; 
          break; 

         case RETURN: 
          if (doEcho) send(wConSock, "\r\n", 2, 0); 
          if (strlen(actNum)) 
          { 
           theNumbers[numNums] = atoi(actNum); 
           if (theNumbers[numNums] > 0 && numNums < MAX_NUMS) numNums++; 
           memset(actNum, 0, sizeof(actNum)); 
          } 
          break; 
        } 
       } 
       break; 
     } 
    } 
    char text[64]; 
    sprintf(text, "\n\n\r Numbers entered:%10d\r\n", numNums); 
    send(wConSock, text, strlen(text), 0); 
    sprintf(text, " Sum of numbers:%10d\r\n", sumThemUp(numNums)); 
    send(wConSock, text, strlen(text), 0); 
    sprintf(text, " Smallest number:%10d\r\n", getSmallest(numNums)); 
    send(wConSock, text, strlen(text), 0); 
    sprintf(text, " Biggest number:%10d\r\n", getBiggest(numNums)); 
    send(wConSock, text, strlen(text), 0); 
    strcpy(text, "\r\n\nPress any key to quit..."); 
    send(wConSock, text, strlen(text), 0); 
    recv(wConSock, &ch, sizeof(ch), 0); 
    close(wConSock); 
} 
관련 문제