Gremlin92
@Gremlin92
Целеустремленный

Не работает передача в сокетах?

Написал простейший класс который используют два приложения - клиент и сервер.
Выдается ошибка на сервере:
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";
}
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
Gremlin92
@Gremlin92 Автор вопроса
Целеустремленный
В методах Send и Receive у клиента должен быть sockfd, а у сервера newsockfd, а у меня там вперемешку, для решения проблемы надо сделать 4 метода всего, одна пара с newsockfd для сервера, вторая с sockfd для клиента. И вызывать их соответствующе для клиента и сервера
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы