Добавил:
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