Задание: написать программу
1. простой ТСР клиент-сервер реализованный с помощью классов(возможно применение потоков - это опциональное усложнение задачи)
2. добавить функции
а) add - добавление записи
b) remove - удаление записи
c) display - вывод всех записей на экран (выводятся на экран клиентом)
Вот client.cpp
Код:
#define WIN32_LEAN_AND_MEAN
#include<iostream>
#include<windows.h>
#include<winsock.h>
#pragma comment (lib, "ws2_32.lib")
using namespace std;
int main()
{
cout << "Client:" << endl;
char ip[15];
u_short port;
char message[MAX_PATH];
cout << "Input IP:" << endl;
cin >> ip;
cout << endl;
cout << "Port: ";
cin >> port;
cout << endl;
WSAData wsa;
WORD Version = MAKEWORD(2, 1);
WSAStartup(Version, &wsa);
if (WSAStartup(Version, &wsa) != 0)
{
cout << "Error with library" << endl;
}
else
{
cout << "WSA library works" << endl;
}
SOCKET Connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Connect == SOCKET_ERROR)
{
cout << "Can't create socket" << endl;
}
else
{
cout << "Socked crated!!!" << endl;
}
SOCKADDR_IN Client;
Client.sin_family = AF_INET;
Client.sin_port = htons(port);
Client.sin_addr.s_addr = inet_addr(ip);
while (1)
{
if (connect(Connect, (SOCKADDR*)&Client, sizeof(Client)))
{
cout << "Connect to server completed !!!" << endl;
send(Connect, "Это должно оказаться в файле!!!", MAX_PATH, 0);
recv(Connect, message, sizeof(message), 0);
break;
}
}
cout << message << endl;
ZeroMemory(message, sizeof(message));
closesocket(Connect);
WSACleanup;
getchar();
getchar();
system("pause");
return 0;
}
Вот server.cpp
Код:
#include "server.h"
// SOCKET socket (family of protocols,TYPE of protocol,transport of protocol);
// Inf for client: Create client-> int connect(SOCKET s,pointer on struct sockaddr, sizeof(sockaddr) );
//create client like this
// give us func's: send and recv
//link for location socked -> BIND!!!
//SOCKET accept - извлечение запросов на соединение из очереди
//она работает до тех пор пока не установиться очередное соединение
//closesocket(SOCKET s) тут все понятно
//WSACleanup чистит используемые ресурсы из библиотеки winsock
Server::Server()
{
stream.open("F:\\Server.txt", ios::app);
}
void Server::ADD(char mess[])
{
while (!stream.eof())
{
stream << mess;
}
}
int main()
{
//перед началом использование библиотеки winsock ее необходимо подготовить к работе вызова функции
//int WSAStartup
cout << "Server: " << endl;
Server value;
char message[MAX_PATH];
WSAData wsa;
WORD Version = MAKEWORD(2, 1); //формируем номер версии библиотеки
WSAStartup(Version, &wsa);
if (WSAStartup(Version, &wsa) != 0)
{
cout << "Error with library" << endl;
}
else
{
cout << "WSA library works" << endl;
}
SOCKET Listen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//режим ожидания подключений
SOCKET Connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//установка соединения с удаленным узлом
if (Listen == SOCKET_ERROR || Connect == SOCKET_ERROR)
{
cout << "Can't create socket!!! " << endl;
}
else
{
cout << "Socket created!!!" << endl;
}
SOCKADDR_IN Server;//структура для winsock2.h
Server.sin_family = AF_INET; //семейство протоколов
Server.sin_port = htons(1200);// порт, htons означает что сетевой порядок байт
//преобразовывает короткое целое из формата локального хоста
Server.sin_addr.s_addr = INADDR_ANY;//IP-адрес
if (bind(Listen, (SOCKADDR*)&Server, sizeof(Server)) == SOCKET_ERROR)//устанавливаем соединение с указанным узлом посредством бинда
{
cout << "Can't bind socket!!!";
}
else
{
cout << "Socked bind created!!!" << endl;
}
listen(Listen, SOMAXCONN);
while (true)
{
if (Connect = accept(Listen, NULL, NULL))//извлечение запросов на соединение из очереди
{
cout << "Client connected!!!" << endl;
recv(Connect, message, sizeof(message), 0);
value.ADD(message);
break;
send(Connect, "Message to client!Hello Client!", sizeof(message), 0);
}
Sleep(100);
}
cout << message << endl;
ZeroMemory(message, sizeof(message));
closesocket(Listen);
closesocket(Connect);
WSACleanup;
getchar();
getchar();
system("pause");
return 0;
}
Вопрос: какой должен быть хедер к серверу?