Отправить сокет в качестве аргумента функции - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать простую программу чата с использованием c ++.

Я довольно новичок в программировании, поэтому я учусь в процессе.

Я столкнулся с проблемой, которую не могу решить.Я создаю сокет в своем классе «Client», и я хочу, чтобы класс Client имел атрибут, который называется, например, _sock, и когда я создаю свой сокет, я хочу сохранить его в моей переменной _sock и везде, где мне нужно это использовать.сокет Я просто использую свою переменную _sock.

Представьте, что у меня есть класс с именем Client, который имеет атрибут SOCKET _sock, и где-то я создаю сокет следующим образом:

 _sock = socket(AF_INET, SOCK_STREAM, 0);

и позже я использую этот_sock для подключения к серверу следующим образом:

connect(_sock, (sockaddr*)&hint, sizeof(hint));

Моя проблема заключается в том, что моя программа аварийно завершает работу, когда я так делаю, но если я делаю так, она не падает:

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

и позже подключитесь к серверу следующим образом:

connect(sock, (sockaddr*)&hint, sizeof(hint));

тогда он будет работать ....

_sock - атрибут класса SOCKET.

Код:

string ipAdress = "127.0.0.1";  // IP Adress of the server
int port = 54000;       // Listening port # on the server


// Initialize Winsock
WSAData data;
WORD ver = MAKEWORD(2, 2);
int wsResult = WSAStartup(ver, &data);

if (wsResult != 0)
{
    cerr << "Can't start winsock, Err #" << wsResult << endl;
    return;
}

// Create socket
_sock = socket(AF_INET, SOCK_STREAM, 0);


if (_sock == INVALID_SOCKET)
{
    cerr << "Can't create socket, Err #" << WSAGetLastError() << endl;
    WSACleanup();
    return;
}

// Fill in a hint structure
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET, ipAdress.c_str(), &hint.sin_addr);

// Connect to server
int connResult = connect(_sock, (sockaddr*)&hint, sizeof(hint));
if (connResult == SOCKET_ERROR)
{
    cerr << "Can't connect to server, Err #" << WSAGetLastError() << endl;
    closesocket(_sock);
    WSACleanup();
    return;
}

Когда я делаю это, программа вылетает.Но если я так делаю, это работает ...:

string ipAdress = "127.0.0.1";  // IP Adress of the server
int port = 54000;       // Listening port # on the server


// Initialize Winsock
WSAData data;
WORD ver = MAKEWORD(2, 2);
int wsResult = WSAStartup(ver, &data);

if (wsResult != 0)
{
    cerr << "Can't start winsock, Err #" << wsResult << endl;
    return;
}

// Create socket
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);


if (sock == INVALID_SOCKET)
{
    cerr << "Can't create socket, Err #" << WSAGetLastError() << endl;
    WSACleanup();
    return;
}

// Fill in a hint structure
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET, ipAdress.c_str(), &hint.sin_addr);

// Connect to server
int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
if (connResult == SOCKET_ERROR)
{
    cerr << "Can't connect to server, Err #" << WSAGetLastError() << endl;
    closesocket(sock);
    WSACleanup();
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...