вызов recv () приводит к ошибке сегментации

0

Я делаю чат-программу с подключением 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);
}
  • 0
    bytesRcvd должен иметь тип ssize_t. Смотрите эту ветку: stackoverflow.com/questions/19224655/using-ssize-t-vs-int
  • 0
    Я изменил его, и нет никакой разницы, я все еще получаю ошибку сегментации, когда я получаю
Теги:
sockets
tcp
segmentation-fault

1 ответ

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);
  • 0
    Когда я комментирую строку с помощью функции recv (), программа работает нормально, но когда я ее раскомментирую, ошибка сегментации возвращается
  • 0
    Вы пытались выделить память для хранения пользовательского ввода?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню