По сути, сервер должен напечатать в файл структуру, заполненную клиентом, и клиент, и сервер должны остановиться, когда 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 печатаются последовательно в файле.