Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Короткий вопрос по сокетам..  (Прочитано 546 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kisly

  • Автор темы
  • Любитель
  • *
  • Сообщений: 82
    • Просмотр профиля
    • Записки
Короткий вопрос по сокетам..
« : 08 Февраль 2011, 01:08:22 »
Если мы в функции
void OpenSock ( int socket, byte nm_socket_msg[] )
{
    socket = connectsock ( SERVER_IP, LS_PORT, "tcp" );

    if(socket < 0) //проверяем дескриптор сокета
return -1;
else //подключились
{
    printf("Установлено соединение с %s:%s\n", SERVER_IP, LS_PORT);
}

// вот тут

}
не читаем, не пишем в сокет, и не закрываем его, то по окончании работы функции он сам закрывается ?

(Нажмите, чтобы показать/скрыть)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Короткий вопрос по сокетам..
« Ответ #1 : 08 Февраль 2011, 06:26:31 »
Конкретно в твоём коде написан феерический бред =)
Ты брось пока сокеты и займись helloworld'ом
для начала язык и его основные конструкции выучи
потом будем разбираться с более тонкими материями

ошибка компиляции в строчке с return -1;
в строчке с "// вот тут" ты забываешь открытый дескриптор и сокет остаётся болтаться до завершения программы (если с другой стороны его по timeout'у не закроют)
это не С++ и RAII здесь даже не пахнет. никаких автоматических вызовов деструкторов и прочего

Оффлайн kisly

  • Автор темы
  • Любитель
  • *
  • Сообщений: 82
    • Просмотр профиля
    • Записки
Re: Короткий вопрос по сокетам..
« Ответ #2 : 08 Февраль 2011, 07:51:13 »
я не претендую на безусловную правильность кода. компилится или нет - это другой вопрос. у меня компилится , но и работает так как мне надо.. с одной стороны, а с другой - нет.
я не пойму почему ("если сокет все еще отрыт по завершению функции") не работаетЖ


typedef unsigned char byte; // 0x00 ... 0xFF

    int net_socket;
    byte net_msg[256];

void main(void)
{
    OpenSock(net_socket, net_msg);

    Read_Socket(net_socket, net_msg, 16);
    Write_Socket(net_socket, net_msg, 16);

    CloseSock(net_socket);
}


т.е. если вместо //вот тут подставить
    Read_Socket(socket, nm_socket_msg, 16);
    Write_Socket(socket, nm_socket_msg, 16);
    CloseSock(socket);

то получим тупенькое однократное эхо. чего и добивались. но мне нужно делать это из main ))
(Нажмите, чтобы показать/скрыть)

Я так и не увидел где здесь феерический бред.. разве что я поменял тип функции с int на void, а return -1 забыл.
« Последнее редактирование: 08 Февраль 2011, 08:02:58 от kisly »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Короткий вопрос по сокетам..
« Ответ #3 : 08 Февраль 2011, 08:07:29 »
Вот с main бред становится все виднее
Извини, у тебя net_socket передаётся по значению
в OpenSock копия этого значения на стеке изменяется, при возврате из функции стек вычищается, открытый сокет повисает в воздухе
в main ты снова имеешь то что было в net_socket до вызова OpenSock

блин... ну я же говорил иди учи уже язык для начала...
kisly, ты уже не в первой выдаёшь такие перлы что просто слов нет. иди учи язык.

Оффлайн kisly

  • Автор темы
  • Любитель
  • *
  • Сообщений: 82
    • Просмотр профиля
    • Записки
Re: Короткий вопрос по сокетам..
« Ответ #4 : 08 Февраль 2011, 08:31:56 »
Менделеев тоже изобрем водку методом проб :) хотя бывали и ошибки..

Пользователь решил продолжить мысль 08 Февраль 2011, 08:39:47:
спасибо. понял. иду учить

Пользователь решил продолжить мысль 08 Февраль 2011, 11:42:58:
void main(void)
{
    OpenSock(&net_socket, net_msg);

..............
}

void OpenSock ( int *socket, byte nm_socket_msg[] )
{
    *socket = connectsock ( SERVER_IP, LS_PORT, "tcp" );
.... ..... ....
}

Зы Yurror, спасибо ! Кстати, Б.В. Керниган, Д.М. Ричи. Язык C - это нормальная книга ?
« Последнее редактирование: 08 Февраль 2011, 11:42:58 от kisly »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Короткий вопрос по сокетам..
« Ответ #5 : 08 Февраль 2011, 12:29:06 »
Менделеев тоже изобрем водку методом проб :) хотя бывали и ошибки..
Ее изобрело царское правительство, когда ему было 9 лет от роду.


Кстати, Б.В. Керниган, Д.М. Ричи. Язык C - это нормальная книга ?
Нормальная, только уже устаревшая.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн kisly

  • Автор темы
  • Любитель
  • *
  • Сообщений: 82
    • Просмотр профиля
    • Записки
Re: Короткий вопрос по сокетам..
« Ответ #6 : 08 Февраль 2011, 13:47:47 »
поздно. я ее уже распечатал  :D

 

Страница сгенерирована за 0.059 секунд. Запросов: 24.