Я создал соединение сервер/клиент. Сервер и клиент оба компилируются правильно, но когда я запускаю клиент, он дает мне Segmentation Fault (core dumped)
C++ Sockets - Клиент дает ошибку сегментации (linux)
Я не знаю, что я делаю неправильно с распределением памяти. Программа не болтается или что-то еще. Я думаю, что моя программа записывает часть памяти только для чтения или может получить доступ к памяти, которая недоступна.
Если кто-нибудь может сказать, где ошибка, я бы очень признателен.
client.cpp
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
int main() {
char a;
int client;
int portNum = 1500;
int bufsize = 1024;
char* buffer = new char (bufsize);
bool isExit = false;
char* ip;
strcpy(ip, "127.0.0.1");
struct sockaddr_in direc;
if ((client = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
cout << "Error creating socket..." << endl;
exit(0);
}
cout << "Enter # to end call" << endl;
cout << "\t\t\t[s] to begin with" << endl;
cin >> a;
cout << "Socket created successfully..." << endl;
direc.sin_family = AF_INET;
direc.sin_port = htons(portNum);
inet_pton(AF_INET, ip, &direc.sin_addr);
if (connect(client,(struct sockaddr *)&direc, sizeof(direc)) == 0)
cout << "Connection to the server " << inet_ntoa(direc.sin_addr) << endl;
cout << "Awaiting confirmation from the server..." << endl;
recv(client, buffer, bufsize, 0);
cout << "Response received: " << buffer;
cout << "\nRemember to put an asterisk at the end to send a message * \n Enter # to terminate the connection" << endl;
do {
cout << "Enter a message: ";
do {
cin >> buffer;
send(client, buffer, bufsize, 0);
if (*buffer == '#') {
send(client, buffer, bufsize, 0);
*buffer = '*';
isExit = true;
}
} while (*buffer != 42);
cout << "Mensage received: ";
do {
recv(client, buffer, bufsize, 0);
cout << buffer << " ";
if (*buffer == '#') {
*buffer = '*';
isExit = true;
}
} while (*buffer != 42);
cout << endl;
} while (!isExit);
cout << "Connection terminated. END PROGRAM\n\n";
close(client);
return 0;
}
Я предполагаю, что вы не нуждаетесь в server.cpp, так как это все хорошо и ждет входящих соединений.
Спасибо!
'char * ip; strcpy (ip, "127.0.0.1"); 'Никогда не выделял никакого хранилища для указателя, на который он указывает, никогда не указывал его ни на что, а затем копировал данные в этот неопределенный регион. KABOOOM! – user4581301
... и 'char * buffer = new char (bufsize);' не то, что вы думаете ('() []'). И у вас точно 0 'delete []'. ... «Я не знаю, что я делаю неправильно с распределением памяти». Все. В любом месте нет правильного распределения. – deviantfan
Почему бы просто не написать 'char * ip =" 127.0.0.1 ";' – Barmar