Необходимо:
Осуществить взаимодействие клиента и сервера на основе протокола UDP.
Функционирование клиента и сервера реализовать следующим образом:
клиент посылает набор слов, сервер возвращает слово с максимальным количеством букв.
Клиент:
#include <winsock2.h>
#include <iostream>
#include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main() {
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData);
struct sockaddr_in peer;
peer.sin_family = AF_INET;
peer.sin_port = htons(1280); // т.к. клиент и сервер на одном компьютере, пишем адрес 127.0.0.1
peer.sin_addr.s_addr = inet_addr("127.0.0.1");
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
int size = sizeof(peer);
char buf[255], b[255];
cout << "Please, enter the string." << endl;
cin.getline(buf, 100, '\n');
sendto(s, buf, sizeof(buf), 0, (sockaddr *)&peer, size);
if (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&peer, &size) != 0) {
b[strlen(b)] = '\0'; //Удаление ненужных символов в конце строки
cout << b << endl;
cin.get();
}
closesocket(s);
WSACleanup();
return 0;
}
Сервер:
#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main() {
WORD wVersionRequested; // максимальный номер версии WinSock
WSADATA wsaData; // структура для WSAStartup
wVersionRequested = MAKEWORD(2, 2); // инициализируем WinSock API
WSAStartup(wVersionRequested, &wsaData);
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); // Создаем серверный сокет
struct sockaddr_in local; // Создаем структуру данных соединения
local.sin_family = AF_INET; // Поле sin_family всегда имеет значение AF_INET
local.sin_port = htons(1280); // Слушаем 1280 порт
local.sin_addr.s_addr = htonl(INADDR_ANY); // Слушаем все сетевые соединения
int size = sizeof(local);
int c = bind(s, (struct sockaddr*)&local, size); // Связываем сокет с соединением
int r = listen(s, 5); // Инициализируем прослушивание сокета
cout<<"Server is ready!\n"<<endl;
while (true) { // Запускаем бесконечный цикл сервера
char res[255], b[255];
int length;
while (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&local, &size) != 0) {
//curlen - текущая длина слов
//maxlen - максимальная длина слова
//index - индекс, соответствующий позиции
//конца самого длинного слова +1
char * str = strtok (b," ");
//int curlen = 0, maxlen = 0, index = 0, i;
while (str != NULL){
cout << str << endl;
str = strtok (NULL," ");}
/*
for(i=0;i < strlen(b);i++)
{
if(b[i] == ' '|| b[i]=='\0'){
if(curlen>maxlen){
maxlen = curlen;
index = i;
}
//если конец строки -> выйти из цикла
if(b[i]=='\0')break;
curlen = 0;
}
else curlen++;
}*/
//cout << b << endl << strlen (b);
//cout << str << endl;
//cout << maxlen << endl;
//cout << " " << endl << b;
}
// Посылает данные на соединенный сокет
sendto(s, b, sizeof(b), 0, (struct sockaddr*)&local, size);
}
closesocket(s); //завершаем работу сокета
//}
WSACleanup();
}
Я понимаю, что надо сделать, но не могу реализовать. Чтобы вывести слово максимальной длины, необходимо разбить строку на слова, а потом определять длину.
Часть кода, которая в комментариях начиная с цикла "for" определяет длину самого длинного слова, а часть когда перед этим, как раз разделяет строку и выводит отдельно слова.
Но всё вместе я не могу это совместить.