gpt4 book ai didi

C++ TCP 客户端 - 接受一个 float 和一个数学运算符

转载 作者:行者123 更新时间:2023-11-28 07:43:01 24 4
gpt4 key购买 nike

这就是我需要帮助完成的事情:提示用户并接受一个 float ,提示用户并接受一个数学运算符(+、- *、/),提示用户并接受另一个 float 。这是我的客户代码。我有一个服务器代码,我需要这个程序将数据发送到它进行处理,然后显示结果。如果需要,我可以发布我的服务器代码。请帮忙!

#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;
}

最佳答案

您的网络代码看起来不错,尽管我不是这方面的专家。提示用户输入非常容易。由于您在问题中使用了 C 风格的 I/O,因此即使您的问题被标记为 C++,我也会使用 C 风格的 I/O。

要将输出写入控制台,请使用 printf:

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

(\n 将输出换行符。)

要从控制台读取输出,请使用 scanf:

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

这里的字符串 "%f" 表示我们正在读取一个 float 。第二个参数是指向我们要存储答案的 float 的指针。有关 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 .

关于C++ TCP 客户端 - 接受一个 float 和一个数学运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15461777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com