Статистика
Главная » Статьи » Лабораторные работы » C/C++

Программирование сокетов в Linux. Создание распределенных сетевых приложений.

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

}

Категория: C/C++ | Добавил: admin (27.01.2015)
Просмотров: 1638 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт