|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.07.2010, 01:16 | #1 |
Пользователь
Регистрация: 24.07.2010
Сообщений: 25
|
Winsock
Всем привет.Начал разбиратся с сокетами и сразуже появились проблемы отправки и получения данных.С сервера на клиент погу отправить текст,а вот с клиента на сервер нет и если отправляю с сервера на клиент то на клиенте выводится текст только до первого пробела.И еще как отправить какую нибудь системную команду например ping.В чем проблема?
Сервер: Код:
Код:
|
24.07.2010, 16:55 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Особо не вникал в код, но в нем распространенная ошибка уже есть.
Используется протокол TCP. Это потоковый протокол и как поток данных будет разбит при передаче/приемке неизвестно. Нельзя с уверенностью сказать, что сообщение уйдёт за раз. send может отправить только кусок сообщения, а может и целиком, зависит это от многих факторов. Та же ситуация и с функцией recv. Она может получить только часть сообщения, а не всё целиком. Правильнее отправлять сообщение в цикле, с проверкой, что отправлено всё сообщение. Если функция send отправила 20 байт из 30, значит нужно вызвать еще раз send для оставшихся 10 байт, из которых отправиться на клиента может только 5. И так по кусочкам отправится всё сообщение и так же из кусочков нужно будет его собирать на клиенте. Чтобы отправить результат работы системной функции, то здесь есть 2 варианта: 1) вызывать не ping ya.ru, a ping ya.ru > temp.txt и в итоге в файле temp.txt получим результат работы функции. 2) Перенаправить поток вывода для функции в память, но как это делается я не подскажу, т.к. не помню. Склероз См. в яндексе про перенаправление stdout. И сервер какой-то странный. Самый простой вариант реализации (на мой взгляд): В функции main ждем подключения нового клиента. Пришел клиент - создаем для него отдельный поток (_beginthread или CreateThread или ...), в который передаем сокет для обмена данными с этим клиентом. В потоке уже будут выполняться все эти send/recv для конкретного клиента. Если всё это делать без потоков на каждого клиента, то много проблем всплывет. Последний раз редактировалось pu4koff; 24.07.2010 в 16:59. |
25.07.2010, 17:55 | #3 |
Пользователь
Регистрация: 24.07.2010
Сообщений: 25
|
pu4koff,можно пример пожалуйста?
Последний раз редактировалось n3sh; 26.07.2010 в 04:41. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
WinSock | ImmortalAlexSan | Работа с сетью в Delphi | 7 | 06.06.2010 22:41 |
WinSock | ImmortalAlexSan | Работа с сетью в Delphi | 1 | 11.05.2010 14:42 |
WinSock | profi | Win Api | 8 | 11.01.2010 21:13 |
WinSock | Killbrum | Win Api | 1 | 18.10.2009 15:15 |
Proxy в WinSock | SHEI'TI | Работа с сетью в Delphi | 3 | 29.03.2008 18:27 |