网络程序似乎没有将答案发回客户端

  • 本文关键字:答案 客户端 程序 网络 c
  • 更新时间 :
  • 英文 :


我正在编写一个客户端和服务器程序,客户端在for"num1操作num2";op是一名操作员。我的程序可以接收表达式、拆分表达式和eval,但它似乎不会将答案发送回客户端。不要担心效率之类的问题,这些代码大部分都是在作业中给出的,不需要更改,只需工作即可。

MAX的值为80

服务器端:

#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <ctype.h>
#define MAX 80
#define PORT 9005
#define SA struct sockaddr
// Function designed for chat between client and server.
void func(int sockfd)
{
char buff[MAX];
int n, i, size;
while (1) {
//makes sure buffer is clear
bzero(buff, MAX);
// read the message from client and copy it in buffer
size = read(sockfd, buff, sizeof(buff));

long int num1, num2;
char op;
//splits the buff into two numbers and an operator
sscanf(buff, "%ld %c %ld", &num1, &op, &num2);
// print buffer which contains the client contents
printf("From client: %ld %c %ldn", num1, op, num2);
//clears buffer before the server's response
bzero(buff, MAX);
n = 0;
//determines operator and evaluates
if(op == '+')
buff[0] = num1 + num2;
else if (op == '-')
buff[0] = num1 - num2;
else if(op == '*')
buff[0] = num1 * num2;
else if(op == '/')
buff[0] = num1 / num2;
// copy server message in the buffer
//while ((buff[n++] = getchar()) != 'n');
// and send that buffer to client
write(sockfd, buff, sizeof(buff));
if (strncmp("exit", buff, 4) == 0) {
printf("Server Exit...n");
break;
}
bzero(buff, MAX);
n = 0;
}
}
// Driver function
int main(int argc, char *argv[]) {
int sockfd, connfd, len;
struct sockaddr_in servaddr, cli;
// socket create and verification
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
printf("socket creation failed...n");
exit(0);
}
else
printf("Socket successfully created..n");
bzero(&servaddr, sizeof(servaddr));
// assign IP, PORT
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
// Binding newly created socket to given IP and verification
if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {
printf("socket bind failed...n");
exit(0);
}
else
printf("Socket successfully binded..n");
// Now server is ready to listen and verification
if ((listen(sockfd, 5)) != 0) {
printf("Listen failed...n");
exit(0);
}
else
printf("Server listening..n");
len = sizeof(cli);
// Accept the data packet from client and verification
connfd = accept(sockfd, (SA*)&cli, &len);
if (connfd < 0) {
printf("server acccept failed...n");
exit(0);
}
else
printf("server acccept the client...n");
// Function for chatting between client and server
func(connfd);
// After chatting close the socket
close(sockfd);
}

客户端:

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#define MAX 80
#define PORT 9005
#define SA struct sockaddr
void func(int sockfd)
{
char buff[MAX];
int n;
for (;;) {
bzero(buff, sizeof(buff));
printf("Enter the string : ");
n = 0;
while ((buff[n++] = getchar()) != 'n')
;
write(sockfd, buff, sizeof(buff));
bzero(buff, sizeof(buff));
read(sockfd, buff, sizeof(buff));
printf("From Server : %sn", buff);
//if ((strncmp(buff, "exit", 4)) == 0) {
//    printf("Client Exit...n");
//    break;
//}
}
}
int main()
{
int sockfd, connfd;
struct sockaddr_in servaddr, cli;
// socket create and varification
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
printf("socket creation failed...n");
exit(0);
}
else
printf("Socket successfully created..n");
bzero(&servaddr, sizeof(servaddr));
// assign IP, PORT
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(PORT);
// connect the client socket to server socket
if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) != 0) {
printf("connection with the server failed...n");
exit(0);
}
else
printf("connected to the server..n");
// function for chat
func(sockfd);
// close the socket
close(sockfd);
}

您的客户端希望从服务器读取一个以NUL结尾的字符串,然后打印该字符串。

read(sockfd, buff, sizeof(buff));
printf("From Server : %sn", buff);

您的服务器尝试将操作的二进制结果放入缓冲区的第一个字节,这在许多情况下不会导致可读文本并截断结果。

if(op == '+')
buff[0] = num1 + num2;
else if (op == '-')
buff[0] = num1 - num2;
else if(op == '*')
buff[0] = num1 * num2;
else if(op == '/')
buff[0] = num1 / num2;

相反,您应该将结果转换为数字的文本表示,例如使用sprintf

int result;
if(op == '+')
result = num1 + num2;
else if (op == '-')
result = num1 - num2;
else if(op == '*')
result = num1 * num2;
else if(op == '/')
result = num1 / num2;
sprintf(buff, "%d", result);

请注意,在实际应用程序中,您可能希望使用snprintf来避免可能的缓冲区溢出。在您的情况下,缓冲区应该足够大,可以容纳转换后的整数值。

最新更新