Скачиваний:
6
Добавлен:
08.08.2022
Размер:
3.54 Кб
Скачать
#include "stdio.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/socket.h"
#include "arpa/inet.h"
#include "netinet/in.h"
#include "pthread.h"
#include "unistd.h"
#include "string.h"
#include "fcntl.h"

#define SERVER_PORT	8080
#define CLIENT_PORT 	7070
#define BUFSIZE 	64

int sockfd;			// дескриптор сокета 
struct sockaddr_in serv_addr;	// "адрес" сервера
socklen_t addr_len;		// размер структуры "адреса" сервера	
bool go_request;		// флаг потока запросов
bool go_receive;		// флаг потока принятия ответов

// Поточная функция отправки запроса на сервер
void * request(void * arg){
	int count = 1;
	char buffer[ BUFSIZE ] = {0};

	// Основная программа
	while(go_request){	
		// Формируем запрос
		sprintf(buffer, " request №%d ", count);
		
		// Отправляем запрос
		int bytes = sendto(sockfd, buffer, 
					   BUFSIZE, 
					   0,
					   (const struct sockaddr*) &serv_addr, 
					   addr_len);

		// Проверка на корректность отправки
		// (хоть и в UDP корректность не всегда показатель того что запрос дойдёт)
		if(bytes > 0){
			printf(" Data send: %s \n", buffer);
			count++;
		}
		else{
		       	perror(" Send error");
			sleep(2);
		}

		sleep(1);
	}
	
	pthread_exit(NULL);
}

// Поточная функция принятие ответов от сервера
void * receive(void * arg){
	char buffer[ BUFSIZE ]; 

	// Основная программа
	while( go_receive ){
		// Читаем сокет от сервера
		int bytes = recvfrom(sockfd, (char *) buffer, 
					     BUFSIZE,
					     0 , 
					     (struct sockaddr *)&serv_addr,
					     &addr_len);
		
		// Проверка считали ли что-нибудь
		if( bytes > 0 ){
			buffer[bytes] = '\0';
			printf( " Data received: %s \n", buffer);		
		}
		else{
		       	perror(" recvform()");
			sleep(3);
		}

		sleep(1);
	}

	pthread_exit(NULL);
}

int main(int argc, char * argv[]){
	printf(" Client started \n");
	
	// Создаём сокет
	if( (sockfd = socket( AF_INET, SOCK_DGRAM, 0)) < 0 ){
		perror(" socket()");
		exit(EXIT_FAILURE);
	}
	
	// Делаем сокет неблокирующим
	int flags = fcntl(sockfd, F_GETFL);
        flags |= O_NONBLOCK;
        fcntl(sockfd, F_SETFL, flags);

	// Задаём адрес сервера
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons( SERVER_PORT );
	serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	addr_len = sizeof(serv_addr);
	
	// Задаём адрес клиента  и привязываем его к сокету
	struct sockaddr_in cli_addr;

	cli_addr.sin_family = AF_INET;
	cli_addr.sin_port = htons(CLIENT_PORT);
	cli_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	
	if(bind(sockfd, (const struct sockaddr*)&cli_addr, sizeof(cli_addr)) < 0 ){
		perror( " bind()");
		exit(EXIT_FAILURE);
	}

	// Создание потоков
	pthread_t tids[2];

	go_receive = go_request = true;
	pthread_create(&tids[0], NULL, &request, NULL);
	pthread_create(&tids[1], NULL, &receive, NULL);

	getchar();
	go_receive = go_request = false;

	// Ждём завершения потоков
	pthread_join(tids[0], NULL);
	pthread_join(tids[1], NULL);
	
	// Закрываем сокет
	close( sockfd );

	printf(" Client ended \n");
	exit( EXIT_SUCCESS );
}

Соседние файлы в папке Lab9_Oreshchenko
  • #
    08.08.202217.67 Кб3client
  • #
    08.08.20223.54 Кб6client.cpp
  • #
    08.08.2022124 б4script.client
  • #
    08.08.2022124 б5script.server
  • #
    08.08.202242.34 Кб3server
  • #
    08.08.20226.52 Кб6server.cpp