Задать вопрос
@acuruma

Что делать, если появляется непонятная ошибка после запуска c++ кода?

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <sys/socket.h>
#include <sys/unistd.h>
#include <sys/types.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <signal.h>
#include <iostream>
#include <thread>
#include <pthread.h>

using namespace std;

#define BUFFSIZE 2048
#define DEFAULT_PORT 4001    //
#define MAXLINK 2048

int sockfd, connfd; 
void stopServerRunning(int p)
{
    close(sockfd);
    printf("Close Server\n");
    exit(0);
}

static char buff[BUFFSIZE];

int connecter()
{
    printf("Listening...\n");
    while (true)
    {
        signal(SIGINT, stopServerRunning);    // 
        // 
        connfd = accept(sockfd, NULL, NULL);
        if (connfd == -1)
        {
            printf("Accept error(%d): %s\n", errno, strerror(errno));
            return -1;
        }
    }
}

void listener()
{
    while(true)
    {
        bzero(buff, BUFFSIZE);
        //
        recv(connfd, buff, BUFFSIZE - 1, 0);
        // 
        printf("клиент: %s\n", buff);
        //
        send(connfd, buff, strlen(buff), 0);
    }
}

void sender()
{
    while(true)
    {
        printf("Please input: ");
        scanf("%s", buff);
        send(connfd, buff, strlen(buff), 0);
        bzero(buff, sizeof(buff));
        recv(connfd, buff, BUFFSIZE - 1, 0);
        printf("recv: %s\n", buff);
    }
}


int main()
{
    struct sockaddr_in servaddr;
    
    //
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sockfd)
    {
        printf("Create socket error(%d): %s\n", errno, strerror(errno));
        return -1;
    }
    // 
    // Соответствует связыванию в псевдокоде (sockfd, ip :: port и некоторые конфигурации);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(DEFAULT_PORT);
    if (-1 == bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)))
    {
        printf("Bind error(%d): %s\n", errno, strerror(errno));
        return -1;
    }
    // END
    // Соответствует listen (sockfd) в псевдокоде;    
    if (-1 == listen(sockfd, MAXLINK))
    {
        printf("Listen error(%d): %s\n", errno, strerror(errno));
        return -1;
    }
    
    while(true)
    {
        thread my_thread1(&connecter);
        if(connfd == true)
        {
            thread(&listener).join();
            thread(&sender).join();
        }
    }

    

    return 0;
}

это исходный код. Он компилируется без никаких проблем при помощи команды "g++ -o server server.cpp -lpthread". Но при запуске высвечивается непонятная ошибка:
ввод:
./server
вывод:
terminate called without an active exception
Listening...
zsh: IOT instruction ./server
  • Вопрос задан
  • 158 просмотров
Подписаться 2 Средний 2 комментария
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Что делать, если появляется непонятная ошибка после запуска c++ кода?

Пытаться понять её -- универсальный рецепт.

это исходный код.
thread my_thread1(&connecter);
if(connfd == true)

В этом месте две ошибки. Первая -- ты сравниваешь int connfd с bool true, а вторая -- ты делаешь это без уважения потоконебезопасным способом. Прямо скажем, у тебя тут гонка между main и connecter. Когда ты эту гонку исправишь, жизнь твоя, скорее всего, наладится. Непонятно, правда, зачем ты вызываешь accept в параллельном потоке вместо того, чтобы сделать это синхронно, прямо в main.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы