Я делаю чат-программу с подключением tcp на моей Linux-машине. У меня была рабочая программа для отправки текста на сервер и получения данных обратно, но когда я использую ту же самую строку с recv(), я получаю ошибку сегментации. Код выглядит так:
#include <stdio.h>
#include <string.h> // for strlen()
#include <stdlib.h> // for exit()
#include <sys/socket.h> // for send() and recv()
#include <unistd.h> // for sleep(), close()
#include <iostream>
#include "Auxiliary.h"
#include "CreateTCPClientSocket.h"
#define RCVBUFSIZE 32 /* Size of receive buffer */
int main (int argc, char *argv[])
{
int sock; /* Socket descriptor */
char * echoString; /* String to send to echo server */
char * tempString; /* String to save the cin */
char echoBuffer[RCVBUFSIZE + 1]; /* Buffer for received string */
int echoStringLen; /* Length of string to echo */
int bytesRcvd; /* Bytes read in single recv() */
bool end = false;
parse_args (argc, argv);
sock = CreateTCPClientSocket (argv_ip, argv_port);
while (!end)
{
bool messageGet = false;
std::cout << "What your message:" << std::endl;
while(!messageGet)
{
std::cin >> tempString;
if(tempString != "")
{
echoString = tempString;
messageGet = true;
}
}
echoStringLen = strlen(echoString); /* Determine input length */
echoString[echoStringLen] = '\0';
echoStringLen += 2;
delaying();
send(sock, echoString, echoStringLen, 0);
info_s("Sent string:", echoString);
// TODO: add code to receive & display the converted string from the server
// use recv()
bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE-1, 0);
std::cout << echoBuffer << std::endl;
}
delaying ();
close (sock);
info ("close & exit");
exit (0);
}
Как вы уверены, что segfault находится в recv()
?
Ваш вызов recv()
выглядит отлично, однако более ранняя строка записывает в нераспределенную память, что вызовет segfault:
std::cin >> tempString;
Попробуйте объявить tempString
следующим образом:
#define INPUT_BUF_SIZE 100
char tempString[INPUT_BUF_SIZE + 1];
Кроме того, этот код кажется необычным:
echoStringLen = strlen(echoString); /* Determine input length */
echoString[echoStringLen] = '\0';
echoStringLen += 2;
echoString
будет уже завершен нулем, иначе strlen()
не вернет правильный результат. Поскольку он уже завершен нулем, добавление \0
ничего не достигает, а увеличение длины на 2 неверно. Вы можете заменить эти три строки следующим образом:
echoStringLen = strlen(echoString);