Написал простейший класс который используют два приложения - клиент и сервер.
Выдается ошибка на сервере:
Error on send: No error
А на клиенте:
Error on read: No error
Код:
Connection.h
#pragma once
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <WinSock.h>
#include <fcntl.h>
#pragma comment (lib,"WS2_32.lib")
#pragma warning(disable : 4996)
#define socklen_t int
class Connection
{
public:
Connection();
int InitServer();
int ServerClose();
int Send();
int Receive();
int InitClient();
int ClientClose();
void bzero(char* buf, int l);
void error(const char* msg);
virtual ~Connection();
protected:
private:
int sockfd, newsockfd;
int buflen = 9;
char* buffer;
struct sockaddr_in serv_addr, cli_addr;
int clilen;
int port;
int servlen;
int n;
const char* address;
};
Connection.cpp
#include "Connection.h"
void Connection::bzero(char* buf, int l)
{
for (int i = 0; i < l; i++)
buf[i] = '\0';
}
void Connection::error(const char* msg)
{
perror(msg);
WSAGetLastError();
WSACleanup();
std::cin.ignore();
exit(1);
}
Connection::Connection()
{
buffer = new char[buflen];
address = new char[16];
}
int Connection::InitServer()
{
WSADATA ws = { 0 };
if (WSAStartup(MAKEWORD(2, 2), &ws) == 0)
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char*)&serv_addr, sizeof(serv_addr));
bzero((char*)&cli_addr, sizeof(cli_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
port = 30000;
serv_addr.sin_port = htons(port);
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
error("ERROR on binding");
if (listen(sockfd, 10) < 0)
error("ERROR on listen");
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
}
return 0;
}
int Connection::ServerClose()
{
shutdown(newsockfd, 0);
shutdown(sockfd, 0);
WSACleanup();
delete buffer;
return 0;
}
int Connection::Send()
{
buffer[0] = 'L';
n = send(sockfd, buffer, buflen, 0);
if (n < 0)
error("ERROR on send");
return 0;
}
int Connection::Receive()
{
bzero(buffer, buflen);
n = recv(newsockfd, buffer, buflen, 0);
if (n < 0)
error("ERROR on read");
return 0;
}
Connection::~Connection()
{
delete[] buffer;
}
int Connection::InitClient()
{
WSADATA ws = { 0 };
if (WSAStartup(MAKEWORD(2, 2), &ws) == 0)
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char*)&serv_addr, sizeof(serv_addr));
bzero((char*)&cli_addr, sizeof(cli_addr));
serv_addr.sin_family = AF_INET;
address = "127.0.0.1";
serv_addr.sin_addr.s_addr = inet_addr(address);
port = 30000;
serv_addr.sin_port = htons(port);
servlen = sizeof(serv_addr);
n = connect(sockfd, (struct sockaddr*)&serv_addr, servlen);
if (n < 0)
error("ERROR on connect");
}
return 0;
}
int Connection::ClientClose()
{
shutdown(sockfd, 0);
WSACleanup();
delete buffer;
return 0;
}
Server.cpp
#include <iostream>
#include "Connection.h"
int main()
{
Connection* con = new Connection();
con->InitServer();
con->Send();
con->ServerClose();
con->~Connection();
std::cout << "Done!\n";
}
Client.cpp
#include <iostream>
#include "Connection.h"
int main()
{
Connection* con = new Connection();
con->InitClient();
con->Receive();
con->ClientClose();
con->~Connection();
std::cout << "Done!\n";
}