Попробуй пойти методом последовательного приближения. То есть, сперва сделай всё на Си и без потоков, сделай на C++ без потоков, потом добавь потоки. Работы на 15 - 20 минут, но поможет лучше понять где проблема.
Попробовал убрать поток из класса socket, проблема отпала.
Но возникает вопрос, почему socket не работает в потоке?
Проблема, при использовании потока в сокете, как я понял в переменной
data_ в функции send_data(char *data_). Если я проверяю в base::init()
длину strlen(line) то всё пучком, но если следом проверяю длину
strlen(data_) в socket::send_data, то как раз на этом месте всё и
сваливается.
Я с потоками не очень.. а как там форк делается? Может дело в том, что разные потори не имеют общей памяти или ещё что-то в этом роде? то что strlen валится говорит, скорее всего, о том, что ему передан указатель на неинициализированный кусок памяти. Если посмотреть на это вкупе с тем, что ты говорил, то получаем, что в init память ещё доступна, а вот в send_data уже нет.
для начала, на надо брать адрес у массива, если хочешь передать его содержимое как указатель. То есть если есть "char buf []", то передаёшь его в send как "send (buf)", а не send (&buf). У тебя там не в одном месте так, особенно вопиющее - с recv(&buffer), то есть recv в явном виде перезапишет данные в твоей проге (ук-ль buffer и всё что после него). Полный венигрет. И при этом ты только кусочек кода показал. Если представить, что там ещё прячется от наших глаз, то неудивительно, что ничё не работает.
Чтобы ты не смущался, могу заверить, что всё, что ты пытаешься сделать, должно работать без проблем. Проблема (наверное, много проблем) в реализации.
> для начала, на надо брать адрес у массива, если хочешь передать его содержимое как указатель. То есть если есть "char buf []", то передаёшь его в send как "send (buf)", а не send (&buf). У тебя там не в одном месте так, особенно вопиющее - с recv(&buffer), то есть recv в явном виде перезапишет данные в твоей проге (ук-ль buffer и всё что после него). Полный венигрет. И при этом ты только кусочек кода показал. Если представить, что там ещё прячется от наших глаз, то неудивительно, что ничё не работает.
Аффигеть :) Я даже в код и не присматривался - а оно вон как :)
Да-да согласен...сто лет не писал, тут решил таким орбазом убить
время... :))))) С этим вроде как разобрался.
Не сочтите за наглость но вопрос, ещё есть )) У меня делается connect
и close сокета в цикле. Но по выводу я наблюдаю что то ли сокеты не
закрываются, то ли ещё что:
Connected: 127.0.0.1:36515
...данные...
Waiting for connect...
Connected: 127.0.0.1:36516
...данные...
Waiting for connect...
Connected: 127.0.0.1:36517
...данные...
Waiting for connect...
Connected: 127.0.0.1:36518
...данные...
Waiting for connect...
Connected: 127.0.0.1:36519
...данные...
т.е. номера портов растут и под конец начинаются подтормаживания
вплоть до полной остановки, как будто заканчиваются свободные сокеты
и идёт ожидание их освобождения.
Можно ли как то делать send не закрывая сокет?
Эмм.. сокет открывает сервер. Клиент _коннектится_ к сокету, а потом закрывает _файловый дескриптор_, использовавшийся для коннекта. Кажется как-то так..
> т.е. номера портов растут и под конец начинаются подтормаживания
вплоть до полной остановки, как будто заканчиваются свободные сокеты
и идёт ожидание их освобождения.
lv, сокет - это такой тип файлового дескриптора, тот, который возвращает вызов socket(). Думаю, понятно, что в свете этого определения клиент не может "подключиться к сокету". Дальше разбирайся сам.
> 0. С портами будет всё нормально.
> 1. Используй netstat
> 2. google "socket TIME_WAIT"
Ппц не в тему. Товарищи, вы чего человека путаете? Он натурально открывает/закрывает соединение для _каждого_ вызова send(). То есть не понимает сути API сокетов вообще. В код-то посмотрите хотя бы.
Да и не хочу его закрывать, он сам отваливается, после передачи первой строки, и повторно его не получается использовать, только предварительно закрыв и открыв новый.
> lv, сокет - это такой тип файлового дескриптора, тот, который возвращает вызов socket(). Думаю, понятно, что в свете этого определения клиент не может "подключиться к сокету". Дальше разбирайся сам.
Хмм... я имел в виду, что socket() вызывает как клиент, так и сервер. И закрытие клиентом своего дескриптора серверу по барабану. На сколько я понял, топикстартер хочет каждый раз закрывать сокет сервера после приёма/передачи.. или как там у него всё сделано.. Про "подключиться к сокету" согласен - фигня. Имел в виду "установить канал связи".