Сервер ищет в текстовом файле слова полученных от клиента и возвращает ему результат. Протокол взаимодействия TCP.
1) Реализация сервера: server.c
Сервер получает от клиента слово, которое необходимо найти и возвращает результат. Также все действия комментируются. Сервер работает до получения пустой строки.
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main()
{
int sock, listener;
struct sockaddr_in addr;
char buf[100], answer[100];
int bytes_read;
FILE *text = fopen("TEXT_BIG", "rt");
if(!text){
puts("Can't open file!");
return 1;
}
puts("File opened.");
listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener < 0)
{
perror("socket");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(6667);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
return 2;
}
puts("Listening for client..");
listen(listener, 1);
sock = accept(listener, NULL, NULL);
if(sock < 0)
{
perror("accept");
return 3;
}
puts("Client connected.\n");
int i;
while(1){
bytes_read = recv(sock, buf, 100, 0);
if(bytes_read <= 1)
{
break;
}
printf("++ Get \"%s\". ", buf);
i = 0;
char str[100];
rewind(text);
while (!feof(text)){
fscanf (text, "%s", str);
if (strcmp(str, buf)==0){
i++;
}
str[0]=0;
}
sprintf (answer, "Result : %d", i);
send(sock, answer, bytes_read, 0);
printf ("Result: %d - sended.\n", i);
}
close(sock); puts("\nConnection closed.");
fclose(text); puts("File closed.");
return 0;
}
2) Реализация клиента: client.c
Единственное назначение клиента — отправлять файлы для поиска. При отправление пустой строки происходит завершение работы клиента.
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
char message[100];
char buf[100];
int sendall(int s, char *buf, int len, int flags)
{
int total = 0;
int n;
while (total < len)
{
n = send(s, buf+total, len-total, flags);
if (n == -1) {break;}
total += n;
}
return total;
}
int main()
{
int sock;
struct sockaddr_in addr;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("socket");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(6667);
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("connect");
return 2;
}
gets(message);
while (message[0]!="0"){
if (strcmp(message, "") == 0) return 1;
send(sock, message, sizeof(message), 0);
recv(sock, buf, sizeof(message), 0);
puts(buf);
gets(message);
}
close(sock);
return 0;
}
|