#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