Почему порт не слушает в C ++ - PullRequest
0 голосов
/ 21 октября 2019

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

int openListenFd(int port){
        int socketDesc, newSocket;
        int opt = 1;
        struct  sockaddr_in server, client;
        string message;
        cout << "The port is " << port << endl;
        int myPort = 3207;
        socketDesc = socket(AF_INET, SOCK_STREAM, 0);
        if(socketDesc == -1){
                cout << "ERROR CREATING SOCKET DESCRIPTOR" << endl;
                exit(EXIT_FAILURE);
        }

        if(setsockopt(socketDesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))){
                cout << "Setsocket error" << endl;
                exit(EXIT_FAILURE);
        }
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        server.sin_port = htons(myPort);

        if(bind(socketDesc, (struct sockaddr *)&server, sizeof(server)) < 0){ 
                cout << "BIND FAILED" << endl;
                exit(EXIT_FAILURE);
        }
        cout << "Bind finished" << endl; //Page 982

        if(listen(socketDesc,10) < 0){
                close(socketDesc);
        }

        return socketDesc;

}

Это должно вернуть файловый дескриптор для соединения, и это не приведет к ошибке в любой момент. Позже он получает вызов accept (), где просто ожидает, вероятно, потому что ни один клиент не может подключиться к нему, так как порт не работает.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Я обнаружил, что проблема заключалась не в коде. Причина, по которой порт не показывался, заключалась в том, что я запускал его на университетском сервере Linux, на котором была установлена ​​виртуальная машина. В результате адрес обратной связи 127.0.0.1 не работал должным образом. Вероятно, это можно исправить, если бы у меня были права администратора, однако это не так.

Решением было загрузить ubuntu и запустить его на моем собственном компьютере, таким образом делая адрес обратной связи действительным.

2 голосов
/ 21 октября 2019

Работает, как и ожидалось для меня. Тестовая программа:

#include <string>
#include <iostream>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>

using namespace std;

int openListenFd() {
    int socketDesc;
    int opt = 1;
    struct  sockaddr_in server;
    string message;
    int port = 3207;
    cout << "The port is " << port << endl;
    socketDesc = socket(AF_INET, SOCK_STREAM, 0);
    if(socketDesc == -1){
            cout << "ERROR CREATING SOCKET DESCRIPTOR" << endl;
            exit(EXIT_FAILURE);
    }

    if(setsockopt(socketDesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))){
            cout << "Setsocket error" << endl;
            exit(EXIT_FAILURE);
    }
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_port = htons(port);

    if(bind(socketDesc, (struct sockaddr *)&server, sizeof(server)) < 0){
            cout << "BIND FAILED" << endl;
            exit(EXIT_FAILURE);
    }
    cout << "Bind finished" << endl; //Page 982

    if(listen(socketDesc,10) < 0){
            close(socketDesc);
    }

    return socketDesc;
}

int main() {
    int fd = openListenFd();
    int rc = system("netstat -tlnp");
    return !(fd && !rc);
}

Выходы:

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 127.0.0.1:3207              0.0.0.0:*                   LISTEN      31807/test          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...