У меня есть клиентское приложение, которое должно подключиться к серверу. Я довольно хорошо знаком с тем, как работает программирование сокетов, но не уверен, почему у меня возникнет ошибка сегментации при попытке создать сокет.
У меня есть функция, которая делает создание сокета. В случае успеха он переходит к соединению с сервером.
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;
}
}