【发布时间】:2019-06-26 06:48:16
【问题描述】:
基本上,服务器需要将客户端填充的结构打印到文件中,当 message.fine == 1 时,客户端和服务器都应该停止。问题是每次创建文件时,都会填充数千为零,表示读写功能没有正常工作。你能帮我解决这个问题吗?
这是客户:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
struct Data
{
int a;
float b;
int fine;
int risultato;
};
int main()
{
int sock;
struct Data message, response;
message.fine = 0;
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = htons(6869);
address.sin_addr.s_addr = inet_addr("127.0.0.1");
sock = socket(AF_INET, SOCK_STREAM, 0);
connect(sock, (struct sockaddr *)&address, sizeof(address));
while(message.fine != 1)
{
printf("\nInsert an integer number:");
scanf("%d", &message.a);
printf("\nInsert a float number:");
scanf("%f", &message.b);
printf("\nIs this the final message? (0 = no, 1 = yes)\n");
scanf("%d", &message.fine);
write(sock, &message, sizeof(struct Data));
read(sock, &response, sizeof(struct Data));
if(response.risultato == -1)
{
fprintf(stderr, "\nServer returned Writing Error\n");
exit(EXIT_FAILURE);
}
else if(response.risultato == 1)
{
printf("\nSuccess in Operation\n");
}
}
close(sock);
exit(EXIT_SUCCESS);
}
这是服务器:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
struct Data
{
int a;
float b;
int fine;
int risultato;
};
void * handler(void * args)
{
struct Data message;
int sock = *(int *)args;
FILE *fp;
if(!(fp = fopen("result.txt", "a")))
{
fprintf(stderr, "Error in opening file\n");
exit(EXIT_FAILURE);
}
while(1)
{
read(sock, &message, sizeof(struct Data));
printf("%d, %f, %d", message.a, message.b, message.fine);
if(fprintf(fp,"\n[%d] [%.2f]\n", message.a, message.b) < 0)
{
message.risultato = -1;
}
else{
message.risultato = 1;
}
if(message.fine == 1)
{
break;
}
write(sock, &message, sizeof(struct Data));
}
fclose(fp);
close(sock);
free(args);
pthread_exit(NULL);
}
int main()
{
int sock, client_sock;
int * new_sock;
pthread_t tid;
struct sockaddr_in address, client_address;
address.sin_family = AF_INET;
address.sin_port = htons(6869);
address.sin_addr.s_addr = inet_addr("127.0.0.1");
socklen_t sock_len = (socklen_t)sizeof(address);
sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (struct sockaddr *)&address, sock_len);
listen(sock, 3);
while(1)
{
new_sock = (int *)malloc(sizeof(int));
sock_len = sizeof(client_address);
client_sock = accept(sock, (struct sockaddr *)&client_address, &sock_len);
*new_sock = client_sock;
pthread_create(&tid, NULL, handler, (void *)new_sock);
pthread_detach(tid);
}
}
实际结果应该是文件上依次打印的message.a和message.b中的数字。
【问题讨论】:
-
为什么每次迭代都分配一个
new_sock? -
为什么不检查
read和write的返回值? -
我会检查读写的返回值,但我认为不会解决问题...
-
read()不保证它会返回sizeof(struct Data)字节。因此,您必须修改代码以根据需要执行尽可能多的read(),直到您积累了一条消息。 -
您不知道
read()或write()有多少字节。这些调用返回一个值是有原因的。 TCP 连接是一个流,您可以读取/写入 任何 个字节数。你“认为这不能解决问题”,但是你是那个问你问题的人,因为你无法解决它。