2013-03-17 28 views
0

這就是我需要幫助完成的:提示用戶並接受一個浮點數,提示用戶並接受一個數學運算符(+, - *,/) ,提示用戶並接受另一個浮點數。這是我的客戶代碼。我有一個服務器代碼,我需要這個程序發送數據進行處理,然後顯示結果。如果需要,我可以發佈我的服務器代碼。請幫忙!C++ TCP客戶端 - 接受一個浮點數和一個數學運算符

#include <iostream> 
using namespace std; 

#include <stdio.h> 
#include <string.h> 
#include <winsock.h> 

// Function prototype 
void StreamClient(char *szServer, short nPort); 

// Helper macro for displaying errors 
#define PRINTERROR(s) \ 
     fprintf(stderr,"\n%s: %d\n", s, WSAGetLastError()) 

//////////////////////////////////////////////////////////// 

void main(int argc, char **argv) 
{ 
    WORD wVersionRequested = MAKEWORD(1,1); 
    WSADATA wsaData; 
    int nRet; 
    short nPort; 

    // 
    // Check for the host and port arguments 
    // 
    if (argc != 3) 
    { 
     fprintf(stderr,"\nSyntax: TCPTimeClient ServerName PortNumber\n"); 
     return; 
    } 

    nPort = atoi(argv[2]); 

    // 
    // Initialize WinSock and check the version 
    // 
    nRet = WSAStartup(wVersionRequested, &wsaData); 
    if (wsaData.wVersion != wVersionRequested) 
    { 
     fprintf(stderr,"\n Wrong version\n"); 
     return; 
    } 

    // 
    // Go do all the stuff a datagram client does 
    // 
    StreamClient(argv[1], nPort); 

    // 
    // Release WinSock resources 
    // 
    WSACleanup(); 
} 

//////////////////////////////////////////////////////////// 

void StreamClient(char *szServer, short nPort) 
{ 
    int nRet;      // return code 
    char szBuf[256];    // client buffer area 
    char szSvr[256];    // server name 

    LPHOSTENT lpHostEntry;   // host data structure 
    SOCKET theSocket;    // client socket 
    SOCKADDR_IN saClient;   // socket address structure 

    // 
    // Get local machine name 
    // 
    nRet = gethostname(szSvr, sizeof(szSvr)); 

    // 
    // Check for errors 
    // 
    if (nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("gethostname()"); 
     return; 
    } 

    // 
    // Display an informational message 
    // 
    printf("Datagram Client [%s] sending to server [%s] on port %d...\n", 
           szSvr, szServer, nPort); 

    // 
    // Find the server 
    // 
    lpHostEntry = gethostbyname(szServer); 
    if (lpHostEntry == NULL) 
    { 
     PRINTERROR("gethostbyname()"); 
     return; 
    } 

    // 
    // Create a TCP/IP datagram socket 
    // 
    theSocket = socket(AF_INET,   // Address family 
         SOCK_STREAM,  // Socket type 
         0);    // Protocol 

    // 
    // Check for errors 
    // 
    if (theSocket == INVALID_SOCKET) 
    { 
     PRINTERROR("socket()"); 
     return; 
    } 

    // 
    // Fill in the address structure of the server 
    // 
    saClient.sin_family = AF_INET; 
    saClient.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); 
             //^Client's address 
    saClient.sin_port = htons(nPort); // Port number from command line 

    // 
    // Connect to the server 
    // 
    nRet = connect(theSocket, 
      (struct sockaddr *)&saClient, 
      sizeof(saClient)); 

    // 
    // Check for errors 
    // 
    if(nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("Connect()"); 
     return; 
    } 

    // 
    // Prepare some data to send to the server 
    // 
    sprintf(szBuf, "From the Client [%s]", szSvr); 

    // 
    // Send data to the server 
    // 
    nRet = send(theSocket,     // Socket 
        szBuf,     // Data buffer 
        (int)strlen(szBuf),  // Length of data 
        0);      // Flags 

    // 
    // Check for errors 
    // 
    if (nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("send()"); 
     closesocket(theSocket); 
     return; 
    } 

    // 
    // Zero out the incoming data buffer 
    // 
    memset(szBuf, 0, sizeof(szBuf)); 

    // 
    // Wait for the reply 
    // 
    nRet = recv(theSocket,     // Socket 
       szBuf,      // Receive buffer 
       sizeof(szBuf),    // Length of receive buffer 
       0);       // Flags 

    // 
    // Check for errors 
    // 
    if (nRet == SOCKET_ERROR) 
    { 
     PRINTERROR("recv()"); 
     closesocket(theSocket); 
     return; 
    } 

    // 
    // Display the data that was received 
    // 
    printf("\n%s", szBuf); 

    // 
    // Close the socket 
    // 
    closesocket(theSocket); 
    return; 
} 
+0

那麼你到底有什麼麻煩? – JSQuareD 2013-03-17 14:33:25

+0

我不知道如何提示用戶輸入一個浮點數和一個數學運算符 – 2013-03-17 14:37:22

+0

@JSQuareD所以我不知道如何進行 – 2013-03-17 14:37:49

回答

1

您的網絡代碼看起來不錯,雖然我不是那方面的專家。提示用戶輸入是很容易的。既然你在你的問題中使用了C風格的I/O,我也會使用C風格的I/O,即使你的問題被標記爲C++

要寫入輸出到控制檯,使用printf

printf("\nPlease enter a floating point number: "); 

\n將輸出一個新行)

爲了從控制檯讀取輸出,使用scanf

float number1; 
scanf("%f", &number1); 

這裏字符串"%f"表示我們正在讀取一個浮點數。第二個參數是一個指向我們想要存儲我們的答案的浮點數的指針。有關scanf的更多信息,請參閱cplusplus-reference

您可以以類似的方式提示輸入其他輸入。完整的代碼:

printf("\nPlease enter a floating point number: "); 
float number1; 
scanf("%f", &number1); 

printf("\nPlease enter a mathematical operator (+,-,*,/): "); 
char mathOperator; 
scanf("%c", &mathOperator); 
if(mathOperator != '+' && mathOperator!= '-' && mathOperator!= '*' && mathOperator!= '/') 
{ 
    //your error handling here 
} 

printf("\nPlease enter a floating point number: "); 
float number2; 
scanf("%f", &number2); 

printf("\nCalculating %f %c %f...", &number1, &mathOperator, &number2); 

//now send data to server 

printf最新的例子,你也可以看到你可以寫值以類似你怎麼看他們的方式輸出,並且可以在一個命令有多個值。有關printf的更多信息,請參閱cplusplus-reference

+0

感謝您的幫助!很少有問題,這部分printf(「\ nCalculating%f%c%f ...」,%number1,&mathOperator,&number2);我必須擺脫%number1中的「%」,並用「&」代替它以使其運行。這個可以嗎?另外,我可以輸入第一個浮點數,但出於某種原因,我沒有選擇輸入數學運算符。它顯示,但跳過它,並要求下一個浮動號碼,然後它退出沒有做任何事情。這是一個更好解釋的截圖。再次感謝http://img836.imageshack.us/img836/445/helpfloat.jpg – 2013-03-17 15:42:22

+0

@JeffFisher'number1'前面的'%'是個拼寫錯誤,你用'&'代替它是正確的。我相應地編輯了我的答案。我不知道爲什麼讓操作員不工作,我習慣於C++ - I/O。嘗試用'c = getchar()'替換'scanf'部分。 – JSQuareD 2013-03-17 15:55:46

+0

我試過c = getchar()沒有運氣。然後我試着改變scanf(「%c」,&mathOperator); scanf(「%f」,&mathOperator);並由於某種原因做了這個伎倆。現在接下來的問題是如何從服務器獲得響應?例如,我可以輸入1加1,但隨後它會關閉。我需要發送到服務器進行處理。我很抱歉,我花了很多時間,但再次感謝您的幫助。我現在比我所能做到的要多得多 – 2013-03-17 16:25:26