 
        
        
          Добавил:
          
          
        
        
    
            nickolai_oreschenko
            
            
            
            
            
            Опубликованный материал нарушает ваши авторские права? Сообщите нам.
          
          Вуз:
          Предмет:
          Файл:УТС 4 семестр / Lab9_Oreshchenko / client
.cpp#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
          
      
    
    
    
          