Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неработает send() 
V
    Опции темы
Townsmen
Дата 4.9.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



Данные с клиента получаю все ОК... а отправить не могу клиенту, cnt==-1
Может я что-то не то делаю, где ошибка?

Код:
Код

#include <iostream>
#include <windows.h>
using namespace std;

bool SendString(SOCKET s, char *str) {
    int cnt=send(s,(char*)&str,strlen(str),0);
    cout << cnt << endl;
    if (cnt==SOCKET_ERROR) return(false); else return(true);
    }

int main() {

            WSADATA w;
            SOCKET s;
            char szRecvBuff[12];
            int ret;
int error = WSAStartup (0x0202, &w);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons (6000);
addr.sin_addr.s_addr = htonl (INADDR_ANY);
s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(s, (LPSOCKADDR)&addr, sizeof(addr));
listen(s, 1);
SOCKET accepted = accept(s, NULL, NULL);
while (true)
    {
    ret = recv(accepted, szRecvBuff, sizeof(szRecvBuff), 0);
    if (ret>1) {
        SendString(s, "hello");
        cout << szRecvBuff << endl;
    }
    }
return 0;
}



PM MAIL   Вверх
boostcoder
Дата 4.9.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



что в errno ?
PM WWW   Вверх
Townsmen
Дата 4.9.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



я работаю в Visual C++, как здесь можно посмотреть код ошибки?
PM MAIL   Вверх
boostcoder
Дата 4.9.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Townsmen @  4.9.2011,  22:56 Найти цитируемый пост)
как здесь можно посмотреть код ошибки? 

как обычно. либо GetLastError()
PM WWW   Вверх
Townsmen
Дата 4.9.2011, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



Цитата

как обычно. либо GetLastError()


извините, я не понимаю что Вы имеете в виду "как обычно либо GetLastError()"
я откомпилировал без ошибок, а как посмотреть ошибку при тестировании я не знаю smile я только начинающий

Добавлено через 3 минуты и 6 секунд
можно подробней?
PM MAIL   Вверх
boostcoder
Дата 4.9.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



функцию SendString() измени так:
Код

bool SendString(SOCKET s, char *str) {
   int cnt=send(s,(char*)&str,strlen(str),0);
   cout << cnt << endl;
   if (cnt==SOCKET_ERROR) {
      cout << "error: " << GetLastError() << endl;
      return(false);
   } else
      return(true);

}


и покажи вывод.
PM WWW   Вверх
Townsmen
Дата 4.9.2011, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



Вывод: error: 10057




PM MAIL   Вверх
boostcoder
Дата 4.9.2011, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Townsmen @  4.9.2011,  23:38 Найти цитируемый пост)
error: 10057

ну вот ;)
http://support.microsoft.com/kb/839503
PM WWW   Вверх
Townsmen
Дата 5.9.2011, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



получается односторонняя коммуникация smile 
уже пробовал менять порт, всё равно без изменений...
смотрел на форумах: пишут что ошибка возникает после отключения сокета или отвергания отправки

может ето потому что у меня клиент написан на action script 3 ?
PM MAIL   Вверх
boostcoder
Дата 5.9.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Townsmen @  5.9.2011,  00:11 Найти цитируемый пост)
может ето потому что у меня клиент написан на action script 3 ?

а клиент не отключается раньше чем этот код успевает отработать?
PM WWW   Вверх
Townsmen
Дата 5.9.2011, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



клиент постоянно подключен и отправляет не одно сообщение, а несколько
вывод такой:
-1
error: 10057
dssd

-1
error: 10057
dsdsds

-1
error: 10057
dsdsd


после того как я послал 3 сообщения: dssd, dsdsds, dsdsd
завтра попробую другой клиент, может ето что-то на стороне клиента не то...
PM MAIL   Вверх
Олег2005
Дата 6.9.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



listen(s, 1);
Попробуйте
listen(s, 5);
При единице очередь маловата.
PM MAIL WWW MSN   Вверх
Townsmen
Дата 6.9.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



Сделал listen(s, 5); всеравно без изменений smile 

Какой Lib нужно подключать Ws2_32.lib или WSOCK32.LIB ? Пробовал по очереди, безрезультатно...

Может у кто-то поможет своим рабочим исходником, а я уже переделаю?
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



выложи полностью код клиента и сервера.
PM WWW   Вверх
Townsmen
Дата 7.9.2011, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



код сервера в первом посте.
клиент на AS3 прикрепил

Добавлено через 7 минут и 42 секунды
я только начинаю осваивать сокеты, по этому клиент можно любой подключать

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  socketsTut.fla 96,02 Kb
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Townsmen @  7.9.2011,  00:33 Найти цитируемый пост)
клиент на AS3

ааа.. но я не знаю ActionScript smile 

держи:
Код

#include <iostream>
#include <windows.h>

bool SendString(SOCKET s, const char *str) {
   int cnt = send(s, str, strlen(str), 0);
   if ( cnt == SOCKET_ERROR ) {
      std::cout << "send error: " << WSAGetLastError() << std::endl;
   } else {
      std::cout << "sended " << cnt << " bytes" << std::endl;
   }
   
   return (cnt!=SOCKET_ERROR);
}

int main() {
   WSADATA w;
   SOCKET s;
   char szRecvBuff[12];
   if ( WSAStartup(0x0202, &w) != NO_ERROR ) {
      std::cout << "WSAStartup error!" << std::endl;
      return 1;
   }

   SOCKADDR_IN addr;
   addr.sin_family = AF_INET;
   addr.sin_port = htons (6000);
   addr.sin_addr.s_addr = htonl (INADDR_ANY);
   
   s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if ( s == INVALID_SOCKET ) {
      std::cout << "socket error: " << WSAGetLastError() << std::endl;
      WSACleanup();
      return 1;
   }

   if ( bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR ) {
      std::cout << "bind error: " << WSAGetLastError() << std::endl;
      closesocket(s);
      WSACleanup();
      return 1;
   }
   
   if ( listen(s, 5) == SOCKET_ERROR ) {
      std::cout << "listen error: " << WSAGetLastError() << std::endl;
      closesocket(s);
      WSACleanup();
      return 1;
   }
   
   while (true) {
      SOCKET accepted = accept(s, NULL, NULL);
      if ( accepted == INVALID_SOCKET ) {
         std::cout << "accept error: " << WSAGetLastError() << std::endl;
         closesocket(s);
         WSACleanup();
         return 1;
      }
      std::cout << "accepted new connection: " << accepted << std::endl;
      
      int ret = recv(accepted, szRecvBuff, sizeof(szRecvBuff), 0);
      if ( ret != SOCKET_ERROR ) {
         std::cout << "received " << ret << " bytes" << std::endl;
         SendString(accepted, "hello");
      } else {
         std::cout << "recv error: " << WSAGetLastError() << std::endl;
      }
      
      closesocket(accepted);
   }

   return 0;
}

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

Это сообщение отредактировал(а) boostcoder - 7.9.2011, 01:39
PM WWW   Вверх
Townsmen
Дата 7.9.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



оО то что надо  smile

только добавил строку и скомпилировал
Код

#pragma comment(lib, "Ws2_32.lib")


послал сообщение "super", в итоге соединение отключилося и вывод
accepted new connection: 108
received 7 bytes
sended 5 bytes


значит всё работает, я еще сделал что бы выводило переменную str c значением hello
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Townsmen @  7.9.2011,  14:34 Найти цитируемый пост)
послал сообщение "super", в итоге соединение отключилося и вывод

получается что твой клиент отправляет сообщение и отключается. потому что строка "received 7 bytes" вывелась бы только в том случае, если бы было прочитано sizeof(szRecvBuff) байт. и выглядела она так: received 12 bytes

Добавлено @ 14:47
Цитата(Townsmen @  7.9.2011,  14:34 Найти цитируемый пост)
значит всё работает

это вряд ли.
а клиент принимает то что ты посылаешь? т.е. "hello".

Это сообщение отредактировал(а) boostcoder - 7.9.2011, 14:48
PM WWW   Вверх
Townsmen
Дата 7.9.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



да клиент что-то не принимает "hello" (((
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(boostcoder @  7.9.2011,  14:46 Найти цитируемый пост)
твой клиент отправляет сообщение и отключается. потому что строка "received 7 bytes" вывелась бы только в том случае, если бы было прочитано sizeof(szRecvBuff) байт. и выглядела она так: received 12 bytes

с клиентом разбирайся сам. по AS я не помощник.
PM WWW   Вверх
Townsmen
Дата 7.9.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.7.2011

Репутация: нет
Всего: 1



я уже разобрался с клиентом, данные уже приходят smile  там были некоторые недоделки...
В AS3 есть 2 вида сокетов: Socket и XMLSocket, у меня был XMLSocket, потому оно что-то не работало, да ещё в флеш после каждой отправки сообщений (send) нужно делать очистку (flush)
Делаю тему как решена. Спасибо, boostcoder за помощь! Жаль что не могу поднять тебе репутацию(
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Townsmen @  7.9.2011,  15:15 Найти цитируемый пост)
Спасибо, boostcoder за помощь!

удачи.
PM WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1127 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.