Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.72
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
#1

bind, listen функции не работают - C++ Builder

21.02.2012, 05:39. Просмотров 5414. Ответов 63
Метки нет (Все метки)

Привет, ето опять я, шас я вбилдер пытаюс написать маленкий клиент и сервер(без компонентов сокета, не выходит, вот код и ощыбкы)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
void __fastcall TForm47::Button1Click(TObject *Sender)
{
WSADATA data;
SOCKET sock;
int bind,listen,chekconnect;
sockaddr_in sockad;
sockad.sin_family = AF_INET;
sockad.sin_port   = htons(80);
sockad.sin_addr   = (in_addr)&inet_addr((const char*)&("127.0.0.1"));
WORD make=MAKEWORD(2,2);
WSAStartup(make,&data);
 
  sock = socket(AF_INET,SOCK_STREAM,0);
 
  if(sock==INVALID_SOCKET)
   {
      int msg = MessageBox(Handle,L"INVALID_SOCKET",L"Socket error",MB_OK|MB_RETRYCANCEL|MB_ICONERROR);
       switch(msg)
        {
            case ID_OK:
             break;
            case ID_RETRY:
             socket(AF_INET,SOCK_STREAM,0);
             break;
            case ID_CANCEL:
             break;
        }
   }
   else
   {
         bind = bind(sock,(sockaddr*)&sock,sizeof(sock));
         if(bind == SOCKET_ERROR)
          {
              int msgbinderror = MessageBox(Handle,L"SOCKET_ERROR",L"Bind error",MB_OK|MB_RETRYCANCEL|MB_ICONERROR);
               switch(msgbinderror)
                {
                    case ID_OK:
                     break;
                    case ID_RETRY:
                     bind(sock,(sockaddr*)&sock,sizeof(sock));
                     break;
                    case ID_CANCEL:
                     break;
                }
          }
       listen = listen(sock,SOMAXCONN);
         if(listen==SOCKET_ERROR)
          {
              int msglistenerror = MessageBox(Handle,L"SOCKET_ERROR",L"Listen error",MB_OK|MB_RETRYCANCEL|MB_ICONERROR);
               switch(msglistenerror)
                {
                    case ID_OK:
                     break;
                    case ID_RETRY:
                     listen(sock,SOMAXCONN);
                }
          }
   }
}
[BCC32 Error] Unit47.cpp(28): E2027 Must take address of a memory location
[BCC32 Error] Unit47.cpp(50): E2314 Call of nonfunction
[BCC32 Error] Unit47.cpp(59): E2314 Call of nonfunction
[BCC32 Error] Unit47.cpp(65): E2314 Call of nonfunction
[BCC32 Error] Unit47.cpp(74): E2314 Call of nonfunction
Проблемы у нег в bind -ом и с listen -ом..


Помогите кто сможет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2012, 05:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос bind, listen функции не работают (C++ Builder):

калькулятор <-> 2 функции не работают универсально - C++ Builder
Мне задали проект калькулятор как в windows или хотя бы похож. я сделал но у меня несколька функции не работают. а пару вообше не...

Две функции работают по отдельности, когда вместе выскакивает ошибка - C++ Builder
Добрый день! Две функции работают по отдельности, когда вместе выскакивает ошибка Функции: public: // User declarations ...

Освобождение памяти после std:bind - C++
Что имею: - CentOS - gcc 4.8 - valgrind Что делаю - С помощью valgrind устраняю утечки - Если приложение остановлено...

[C] Обязателен ли вызов listen() после bind()? - C++ Linux
Например,требуется реализовать клиент-сервер по протоколу TFTP. В случае сервера создаём сокет,затем вызываем bind(). Обязательно ли после...

Listen to me или listen me - Иностранные языки
Здравствуйте, почему первый вариант верный? В каких случаях я ставится to? Есть какое нибудь правило? Почему тогда &quot;help me&quot;...

Адаптер функции bind() - C++
Читаю у Липпмана про адаптер bind, ...какие-то знакоместа. Компилятор на них ругается, я тоже. Вывести тип на создаваемый объект он тоже...

63
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,684
21.02.2012, 07:59 #2
помоему ты в синад
др какойто страх передаешь. Вставь код что я тебе заслал он рабочий 100% или вообще используй мой движок
0
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
21.02.2012, 08:36  [ТС] #3
vxg,
Ну да, спасибо за код, но лучше "собрать велосипед сам, чем использовать заводной..."

Может ктото указать путь как зоставить компилятору осознать те функций?
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,684
21.02.2012, 09:24 #4
1 - не делай так
C++
1
sin_addr   = (in_addr)&inet_addr((const char*)&("127.0.0.1"));
а делай так
C++
1
sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
2 - если уж ты объявил переменную имеющую такое же имя что и функция явно указывай область видимости
C++
1
bind = ::bind(sock,(sockaddr*)&sock,sizeof(sock));
1
Evg
Эксперт CАвтор FAQ
18259 / 6384 / 440
Регистрация: 30.03.2009
Сообщений: 17,669
Записей в блоге: 28
21.02.2012, 10:02 #5
В bind вторым и третьим параметром надо вместо sock передавать sockad
1
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.02.2012, 10:13 #6
Вот оно же тебе говорит:
[BCC32 Error] Unit47.cpp(50): E2314 Call of nonfunction
[BCC32 Error] Unit47.cpp(59): E2314 Call of nonfunction
[BCC32 Error] Unit47.cpp(65): E2314 Call of nonfunction
[BCC32 Error] Unit47.cpp(74): E2314 Call of nonfunction
Вполне справделиво говорит, потому как
C++
1
int bind,listen,chekconnect;
Зачем ты это сделал? ты спрятал вызов bind, listen за локальными именами.
Поэтому, либо поменяй эти имена (лучший вариант), либо вызывай потом ::bind, ::listen, иначе он думает что ты локальный int как функцию пытаешься позвать.

Ну и про передачу сокета вместо адреса в
C++
1
bind(sock,(sockaddr*)&sock,sizeof(sock));
тебе уже сказали.

а .. про локальные имена тебе тоже сказали ))
--
И еще заверни всё в ассерты, которые исключениями кидаются, вместо if (что-то) {} else {что-то другое}
какой смысл в возможностях языка, если ими не пользоваться?
1
Evg
Эксперт CАвтор FAQ
18259 / 6384 / 440
Регистрация: 30.03.2009
Сообщений: 17,669
Записей в блоге: 28
21.02.2012, 10:18 #7
Цитата Сообщение от villu Посмотреть сообщение
А еще лучше заверни всё в ассерты, которые исключениями кидаются, вместо if (bind_res == -1) {}
Assert - средство внутреннего контроля, if - средство пользовательского контроля. И ни в коем случае не надо их путать
1
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
21.02.2012, 21:04  [ТС] #8
Спасибо всем, сделал как вы сказали, но шас ругается на ето:
C++
1
sockad.S_addr   = inet_addr("127.0.0.1");
C++
1
[BCC32 Error] Unit47.cpp(28): E2034 Cannot convert 'unsigned long' to 'in_addr'
А если написать
C++
1
sockad.S_un.S_addr   = inet_addr("127.0.0.1");
то говорит что S_un не член етой структури...

А далше заработало, я :: добовил как сказали...
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.02.2012, 21:17 #9
C++
1
sockad.S_addr
откуда это вообще?

так надо.
C++
1
sockad.sin_addr.s_addr = ...;
1
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
22.02.2012, 00:39  [ТС] #10
villu,
спасибо огромное, продолжаю далше писать

C++
1
sockad.sin_addr.S_un.S_addr   = inet_addr("127.0.0.1");
Так исправил ту ошибку

Добавлено через 27 минут
Тепер новая проблема, компилируетса нормално. но WSAGetLastError показивает что выпало 10022

А MessageBox останавливается на bind и выпадает bind error

как его устранить? вот код, спасибо заранее...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
void __fastcall TForm47::Button1Click(TObject *Sender)
{
unsigned char buf[256] = "must receive some text";
WSADATA data;
SOCKET sock,saccept;
int bind,listen,chekconnect;
sockaddr_in sockad;
sockad.sin_family = AF_INET;
sockad.sin_port   = htons(80);
sockad.sin_addr.S_un.S_addr   = inet_addr("127.0.0.1");
WORD make=MAKEWORD(2,2);
WSAStartup(make,&data);
 
  sock = ::socket(AF_INET,SOCK_STREAM,0);
 
  if(sock==INVALID_SOCKET)
   {
      int msg = MessageBox(Handle,L"INVALID_SOCKET",L"Socket error",MB_RETRYCANCEL|MB_ICONERROR);
       switch(msg)
        {
            case ID_RETRY:
             ::socket(AF_INET,SOCK_STREAM,0);
             break;
            case ID_CANCEL:
             break;
        }
   }
   else
   {
         bind = ::bind(sock,(sockaddr*)&sockad,sizeof(sockad));
         if(bind == SOCKET_ERROR)
          {
              int msgbinderror = MessageBox(Handle,L"SOCKET_ERROR",L"Bind error",MB_RETRYCANCEL|MB_ICONERROR);
               switch(msgbinderror)
                {
                    case ID_RETRY:
                     ::bind(sock,(sockaddr*)&sockad,sizeof(sock));
                     break;
                    case ID_CANCEL:
                     break;
                }
          }
       listen = ::listen(sock,SOMAXCONN);
         if(listen==SOCKET_ERROR)
          {
              int msglistenerror = MessageBox(Handle,L"SOCKET_ERROR",L"Listen error",
                                              MB_RETRYCANCEL|MB_ICONERROR);
               switch(msglistenerror)
                {
                    case ID_RETRY:
                     ::listen(sock,SOMAXCONN);
                     break;
                    case ID_CANCEL:
                     break;
                }
          }
          else
          {
           saccept = accept(sock,(sockaddr*)&sockad,(int*)sizeof(&sockad));
            if(saccept==INVALID_SOCKET)
             {
                 int msgaccept = MessageBox(Handle,L"INVALID_SOCKET",L"accept error",
                                            MB_RETRYCANCEL|MB_ICONERROR);
                     switch(msgaccept)
                       {
                           case ID_RETRY:
                             ::accept(sock,(sockaddr*)&sockad,(int*)sizeof(&sockad));
                             break;
                           case ID_CANCEL:
                             break;
                       }
             }
             else
              {
                  if((recv(sock,(char*)&buf,sizeof(buf),0))==SOCKET_ERROR)
                   {
                       int msgrcv = MessageBox(Handle,L"SOCKET_ERROR",L"recv erro",
                                               MB_RETRYCANCEL|MB_ICONERROR);
                           switch(msgrcv)
                            {
                                case ID_RETRY:
                                 ::recv(sock,(char*)&buf,sizeof(buf),0);
                                break;
                                case ID_CANCEL:
                                 break;
                            }
                   }
                   else if((send(sock,(char*)&buf,sizeof(buf),0))==SOCKET_ERROR)
                     {
                         int msgsend = MessageBox(Handle,L"SOCKET_ERROR",L"send error",
                                                  MB_RETRYCANCEL|MB_ICONERROR);
                            switch(msgsend)
                             {
                                 case ID_RETRY:
                                  ::send(sock,(char*)&buf,sizeof(buf),0);
                                  break;
                                 case ID_CANCEL:
                                  break;
                             }
                     }
              }
 
          }
          ShowMessage(IntToStr(WSAGetLastError()));
    }
  shutdown(sock,SD_BOTH);
  WSACleanup();
  closesocket(sock);
}
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,684
22.02.2012, 01:21 #11
потому что
C++
1
::socket(AF_INET,SOCK_STREAM,0)
это
C++
1
::socket(AF_INET,SOCK_STREAM,IPPROTO_IP)
потому что
C++
1
#define IPPROTO_IP              0               /* dummy for IP */
и кто его знает что машина будет с ним делать (dummy for IP)
1
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
22.02.2012, 05:12  [ТС] #12
vxg,
А чем его заменить?
Заменил с IPPROTO_TCP но ефект тот же...


protocol Meaning
IPPROTO_ICMP
1
The Internet Control Message Protocol (ICMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6 and the type parameter is SOCK_RAW or unspecified.

This protocol value is supported on Windows XP and later.
IPPROTO_IGMP
2
The Internet Group Management Protocol (IGMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6 and the type parameter is SOCK_RAW or unspecified.

This protocol value is supported on Windows XP and later.
BTHPROTO_RFCOMM
3
The Bluetooth Radio Frequency Communications (Bluetooth RFCOMM) protocol. This is a possible value when the af parameter is AF_BTH and the type parameter is SOCK_STREAM.

This protocol value is supported on Windows XP with SP2 or later.
IPPROTO_TCP
6
The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_STREAM.
IPPROTO_UDP
17
The User Datagram Protocol (UDP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_DGRAM.
IPPROTO_ICMPV6
58
The Internet Control Message Protocol Version 6 (ICMPv6). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6 and the type parameter is SOCK_RAW or unspecified.

This protocol value is supported on Windows XP and later.
IPPROTO_RM
113
The PGM protocol for reliable multicast. This is a possible value when the af parameter is AF_INET and the type parameter is SOCK_RDM. On the Windows SDK released for Windows Vista and later, this protocol is also called IPPROTO_PGM.

This protocol value is only supported if the Reliable Multicast Protocol is installed.
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
22.02.2012, 07:21 #13
C++
1
socket(AF_INET,SOCK_STREAM,0)
Запись вполне себе корректна, так как система в этой ситуации (AF_INET, SOCK_STREAM) сама выберет TCP.
вот тут замени
C++
1
2
sockaddr_in sockad = {0};
....
хотя Wisock может и не в этом проблема.
2
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,684
22.02.2012, 07:40 #14
как вариант - брэндмауэр закрыл проге доступ или порт занят др по. Описание кода ошибки смотрели? Сам не люблю но иногда помогает. Мой пример для тсп запускали со своими параметрами? Тоже не люблю когда помогают но иногда помогает
1
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
22.02.2012, 07:53 #15
А еще может быть вариант, что работа идет под Вин7, а оно не допускает прибивать адреса к 1-1024 неадминистраторам. попробуй 8080 порт, например
2
22.02.2012, 07:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2012, 07:53
Привет! Вот еще темы с ответами:

Перегруженные функции и bind - C++
Привет всем! В классе QPushButton есть две версии функции 1. void setGeometry(int x, int y, int w, int h) 2....

Ошибка после функции bind - C++
Пытаюсь первый раз написать по книге клиент-сервер. В этом практически ничего не понимаю. Во время компиляции нет предупреждений и...

WinSock выдает ошибку при вызове функции bind - C++
исходный код (взять ОТСЮДА почти полностью, &quot;пример реализации TCP сервера&quot;) #pragma hdrstop #include &lt;tchar.h&gt; #include...

как правильно перекомпилировать под windows функции connect accept bind? - C++
компилятор пишет ошибку &quot;переопределение. другая кмпоновка&quot; смотрю про connect на msdn, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru