Ошибка сегментации при создании сокета - PullRequest
0 голосов
/ 30 августа 2018

У меня есть клиентское приложение, которое должно подключиться к серверу. Я довольно хорошо знаком с тем, как работает программирование сокетов, но не уверен, почему у меня возникнет ошибка сегментации при попытке создать сокет.

У меня есть функция, которая делает создание сокета. В случае успеха он переходит к соединению с сервером.

if(socketClient::sock = socket(AF_INET,SOCK_STREAM,0) < 0);
        return false;

int on = 1;
if (setsockopt(socketClient::sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) == -1)
    return false;

if(socketClient::connect("172.16.0.37", 50001))
{
    socketClient::connected_ = true;
    return true;
}

Я использовал gdb для подтверждения того, что при создании сокета возникает ошибка сегментации socket(AF_INET,SOCK_STREAM,0)

Я довольно озадачен на этом этапе. Мой код компилируется без предупреждений и связывается в исполняемый штраф. Что может быть причиной этого?

socketClient.h: (определено)

#include <iostream>
#include "clientSocket.h"
#include <vector>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <vector>

#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <sys/sendfile.h>
#include <sys/stat.h>

#ifndef SOCKETCLIENT_H
#define SOCKETCLIENT_H

using namespace std;

class socketClient final
{
public:
    socketClient(std::string, int);
    ~socketClient();



    static bool connect(std::string, int);




private:
    static int sock;
        };

#endif // SOCKETCLIENT_H

Полная программа:

// main.cpp

#include <cstdio>
#include "logger.h"
#include "startDaemon.h"
#include "hostFinder.h"
#include "localDatabase.h"
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <boost/format.hpp>
#include "socketClient.h"


int main()
{
    try
    {
        socketClient::connect("127.0.0.1", 50001);          


    }
    catch (std::exception& e)
    {
        printf("We caught something bad");
        return 0;
    }

}

// socketClient.cpp

bool socketClient::connect(std::string hostName, int port)
{
    std::string eMessage;
    boost::format fmt;
    try
    {
        sock = socket(AF_INET,SOCK_STREAM,0);
        return true;    

    }
    catch (std::exception& e)
    {
        fmt = boost::format("Process Shutdown: %s") % e.what();
        eMessage = fmt.str();
        logger::instance().log(eMessage, logger::kLogLevelError);
        return false;
    }
}

1 Ответ

0 голосов
/ 30 августа 2018

In https://www.binarytides.com/code-a-simple-socket-client-class-in-c/ - рабочий код. Вы должны реализовать конструктор и создать экземпляр класса. Затем вызовите connect() из этого экземпляра cf https://www.binarytides.com/code-a-simple-socket-client-class-in-c/ static не обязательно ...

класс :

/**
    TCP Client class
*/
class tcp_client
{
private:
    int sock;
    std::string address;
    int port;
    struct sockaddr_in server;

public:
    tcp_client();
    bool conn(string, int);
    bool send_data(string data);
    string receive(int);
};

конструктор :

tcp_client::tcp_client()
{
    sock = -1;
    port = 0;
    address = "";
}

метод :

/**
    Connect to a host on a certain port number
*/
bool tcp_client::conn(string address , int port)
{
    //create socket if it is not already created
    if(sock == -1)
    {
        //Create socket
        sock = socket(AF_INET , SOCK_STREAM , 0);
        if (sock == -1)
        {
            perror("Could not create socket");
        }

    cout<<"Socket created\n";
}
// [ ... ]
}

main.cpp:

int main(int argc , char *argv[])
{
    tcp_client c; // create instance
    string host;

    cout<<"Enter hostname : ";
    cin>>host;

    //connect to host
    c.conn(host , 80);  // invoke method

    //[ ... ]
}

код является неполной копией https://www.binarytides.com/code-a-simple-socket-client-class-in-c/:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...