2013-09-18 7 views
0

У меня есть эта функция C.Функция C, Сетевое программирование

void execMessage(int sockfd,void *structCHARMS, ClientData *client) 
{ 
    ClientData *client_recv = (ClientData *) structCHARMS; 

    client->local_addr=client_recv->local_addr; 
    client->mode = client_recv->mode; 

    char*msg; 
    CharmsMsg chmsg = {charms_msg_map[XTypes_CONFIG_PARAM].msg_code, client, 1184}; 
    msg = encode(&chmsg, "0.01"); 
    ssize_t n = 0; 
    n = send(sockfd,msg,strlen(msg), 0); 

} 

Он вызывается из основной функции классического TCP-сервера, подключенного к TCP-клиенту. Он создает сообщение (с определенным кодом функции) и отправляет его на сервер.

Проблема в том, что при вставке этой функции в тот же файл main() она работает правильно, но когда я вставляю ее в другой файл, у меня возникает ошибка сегментации при запуске программы.

Может ли кто-нибудь мне помочь? Спасибо

+3

В моем хрустальном шаре я вижу статическую функцию в другом файле. Его имя - 'encode()' или 'strlen()' или 'send()' Или это локальный typedef? – wildplasser

+0

encode - это локальный typedef. strlen() и send() - функция C. strlen() в string.h и send() в . Моя проблема в том, что когда я вставляю эту функцию в ServerTCP.c, файл, содержащий main(), он работает правильно .... но когда я вставляю его в другой файл, он не работает ... особенно функция отправки не работает work :( – EngAndreaR

+0

Вы используете 'encode' как функцию, а не typedef. – Barmar

ответ

0

Как уже упоминалось ранее, вам нужно выяснить, где именно программа прервана. Прямо сейчас вы создаете локальный символ * и передаете адрес указателя на функцию кодирования. У вас есть код для этой функции? Мне кажется, что вы хотите вернуть указатель из функции и в нем вернуть кучу закодированную c-строку. После его отправки вы захотите освободить эту память, чтобы у вас не было утечки.

+0

Я просто отлаживаю код. Поэтому encode() является сложной функцией и возвращает char *. Я вставляю точку останова в последнюю строку encode(), и я получил это значение – EngAndreaR

+0

Breakpoint 1, encode (chmsg = 0x7fff5fbfc6f0, protocol_version = 0x100008c90 "0.01") по протоколу.c: 46 \t return xmlbuffer; (gdb) p xmlbuffer $ 1 = 0x100807400 " \ N \ n

\ n \ n \ n \ n
\ n \ n EngAndreaR

+0

@EngAndreaR : Какой указатель выполняет 'encode()' return? Является ли это указателем на глобальную переменную? Статическая переменная? Локальная переменная, распределенная по стеклу? Переменная, назначенная кучей (например, с помощью 'malloc()' или 'strdup()')? –

Смежные вопросы