Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > неработает send()


Автор: Townsmen 4.9.2011, 19:11
Данные с клиента получаю все ОК... а отправить не могу клиенту, 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;
}



Автор: boostcoder 4.9.2011, 19:39
что в errno ?

Автор: Townsmen 4.9.2011, 22:56
я работаю в Visual C++, как здесь можно посмотреть код ошибки?

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

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

Автор: Townsmen 4.9.2011, 23:23
Цитата

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


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

Добавлено через 3 минуты и 6 секунд
можно подробней?

Автор: boostcoder 4.9.2011, 23:32
функцию 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);

}


и покажи вывод.

Автор: Townsmen 4.9.2011, 23:38
Вывод: error: 10057




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

ну вот ;)
http://support.microsoft.com/kb/839503

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

может ето потому что у меня клиент написан на action script 3 ?

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

а клиент не отключается раньше чем этот код успевает отработать?

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

-1
error: 10057
dsdsds

-1
error: 10057
dsdsd


после того как я послал 3 сообщения: dssd, dsdsds, dsdsd
завтра попробую другой клиент, может ето что-то на стороне клиента не то...

Автор: Олег2005 6.9.2011, 14:39
listen(s, 1);
Попробуйте
listen(s, 5);
При единице очередь маловата.

Автор: Townsmen 6.9.2011, 15:22
Сделал listen(s, 5); всеравно без изменений smile 

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

Может у кто-то поможет своим рабочим исходником, а я уже переделаю?

Автор: boostcoder 7.9.2011, 00:06
выложи полностью код клиента и сервера.

Автор: Townsmen 7.9.2011, 00:33
код сервера в первом посте.
клиент на AS3 прикрепил

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

Автор: boostcoder 7.9.2011, 01:13
Цитата(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;
}

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

Автор: Townsmen 7.9.2011, 14:34
оО то что надо  smile

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

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


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


значит всё работает, я еще сделал что бы выводило переменную str c значением hello

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

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

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

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

Автор: Townsmen 7.9.2011, 14:53
да клиент что-то не принимает "hello" (((

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

с клиентом разбирайся сам. по AS я не помощник.

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

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

удачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)