Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.72
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
#1

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

21.02.2012, 05:39. Просмотров 5632. Ответов 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 функции не работают универсально
Мне задали проект калькулятор как в windows или хотя бы похож. я сделал но у...

Две функции работают по отдельности, когда вместе выскакивает ошибка
Добрый день! Две функции работают по отдельности, когда вместе выскакивает...

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

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

Listen to me или listen me
Здравствуйте, почему первый вариант верный? В каких случаях я ставится to? Есть...

Перегруженные функции и bind
Привет всем! В классе QPushButton есть две версии функции 1....

63
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
24.02.2012, 11:44  [ТС] #41
vxg,
Типо в током последователном палажение сделано, но (код 10057)
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.02.2012, 12:59 #42
у вас
C++
1
2
recv(saccept,(char*)&buf[0],buf->size(),0);
send(sock,(char*)&bufsend,sizeof(bufsend),0)
а должно быть
C++
1
2
recv(saccept,(char*)&buf[0],buf->size(),0);
send(saccept,(char*)&bufsend,sizeof(bufsend),0)
1
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
24.02.2012, 22:00  [ТС] #43
vxg,

Я шас с ума соиду, сделал так но опять 10022 и bind error

C++
1
  bind = ::bind(sock,(sockaddr*)&sockad,sizeof(sockad));
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.02.2012, 22:59 #44
и опять же открывая файл с определениями ошибок видим что это WSAEINVAL что означает The socket is already bound to an address - я так понимаю что вы пытаетесь повторно привязать уже привязанный сокет к адаптеру - чудес не бывает, если меняли только recv/send а ошибка вылезла на другом конце - значит не только их меняли
0
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.02.2012, 02:11  [ТС] #45
vxg,
А как подсоеденить заного?

Задолбал уже вопросами ((

или как устранить ету ошибку?
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
25.02.2012, 10:03 #46
по коду ошибки невозможно сказать в какой именно строке именно вашего кода затаился баг - можно лишь сказать что скорее всего происходит не так. листая опубликованные ранее исходники видим что у вас по нажатию некой кнопки происходит вся череда событий - инициализация библиотеки, связывание, прослушивание и, наверное, отправка / получение. если вы не убиваете сервер и второй раз нажмете на эту кнопку, то естественно не сможете привязаться к адаптеру так как вы уже к нему привязались во время первого нажатия.
0
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.02.2012, 12:06  [ТС] #47
vxg,
Сокет убирается с помошю closesocket?

Если да то убераю...
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
25.02.2012, 12:35 #48
сервер-сокет убираешь?
0
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.02.2012, 21:54  [ТС] #49
vxg,
Как его можно убрать?
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
25.02.2012, 23:35 #50
ты делаешь closesocket(sock) или closesocket(saccept)? и вообще - каков механизм взаимодействия? если у тебя однократная посылка, то можно все запихать в одну кнопку, а если обмен - не нужно запускать сервер каждый раз по нажатию
1
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
26.02.2012, 05:58  [ТС] #51
vxg,
Система, такава, написать тест сервер, потом послать сообшение с него в книент...

И с клиента тоже принимать

Нет я только closesock(sock) делаю... Добовить и closesock(saccept) ? ? ?

Спасибо заранее и за все...
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
26.02.2012, 14:16 #52
ваш случай - однократная пересылка. в такой задаче вам можно засунуть в одну кнопку все действия которые я описал вам тут http://www.cyberforum.ru/cpp-builder...ml#post2521313. обратите внимание на то что вы обязаны закрывать все сокеты и библиотеку в обработчике нажатия кнопки иначе повторное нажатие приведет к ошибке - библиотека уже инициализирована, сокет уже привязан. если и в этом случае проблемы попробуйте http://www.cyberforum.ru/cpp-linux/thread451559.html#post2520039
1
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
26.02.2012, 16:16  [ТС] #53
vxg,
Точно так сделал как вы сказали, ((
И
C++
1
2
const int on = 1;
setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on);
Добовил, но ошибка та же...

Уже демаю сдатса... (((

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
void __fastcall TForm47::Button1Click(TObject *Sender)
{
#if defined WIN32 || defined WIN64
std::vector<char*>buf[1024]; //char buf, for receiving the data
unsigned char bufsend[256] = "Hello world"; //char buf to be send
WSADATA data; //wsadata structure
time_t retrytime; //the wait time
SOCKET sock,saccept; //sockets
int bind,listen,chekconnect,accs;//define the return of bind, listen, chekconnect,accs for
                                 //check connections
sockaddr_in sockad={0}; //Structure for identification IP.PORT and etc... In sockad first argument will be 0
sockaddr_in sockadacc={0};//structure for client
sockad.sin_family = AF_INET; //family of sockad(address) will be Address Family Inet
sockad.sin_port   = htons(PORT);//port is defined as 80
sockad.sin_addr.S_un.S_addr   = inet_addr("127.0.0.1");//localhost server IP
WORD make=MAKEWORD(2,2);//make word, for WSAStartup
WSAStartup(make,&data);//WSAStartup
memset((void*)&sockad,0,sizeof(sockad));//Cleaning the sockad structure
memset((void*)&saccept,0,sizeof(saccept));//Cleaning the saccept structure
  sock = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//Creating the socket
 
if(sock==INVALID_SOCKET)//if sock is not connected
  {
   ShowMessage(IntToStr(WSAGetLastError()));
          int msg = MessageBox(Handle,L"INVALID_SOCKET",L"Socket error",MB_RETRYCANCEL|MB_ICONERROR);
           switch(msg)
                {
                        case ID_RETRY:
                         ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//trying to re-establish creation of socket
                        break;
                        case ID_CANCEL:
                         break;
                }
 
   }
 
   else //if socket is created successfully
   {             const int on= 1;
    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&on,sizeof(on));
                 bind = ::bind(sock,(sockaddr*)&sockad,sizeof(sockad));//binding the socket
                 if(bind == SOCKET_ERROR)//if binding is failed
                  {
                          int msgbinderror = MessageBox(Handle,L"SOCKET_ERROR",L"Bind error",
                                                        MB_RETRYCANCEL|MB_ICONERROR);
                           switch(msgbinderror)
                                {
                                 case ID_RETRY:
                                  bind=::bind(sock,(sockaddr*)&sockad,sizeof(sock));//trying to re-establish socket binding
                                 break;
                                   case ID_CANCEL:
                                   break;
                                }
                  }
           listen = ::listen(sock,SOMAXCONN);//else if binding is successfully listening the socket
                 if(listen==SOCKET_ERROR)//if listening the socket is failed
                  {
                   int msglistenerror = MessageBox(Handle,L"SOCKET_ERROR",L"Listen error",
                                                  MB_RETRYCANCEL|MB_ICONERROR);
                    switch(msglistenerror)
                        {
                         case ID_RETRY:
                          listen=::listen(sock,SOMAXCONN);//re-establishing listening to socket
                         break;
                          case ID_CANCEL:
                         break;
                        }
                  }
                  else//if listening is succesfull
                  {
                  accs = sizeof(sockadacc);
                   saccept = accept(sock,(sockaddr*)&sockadacc,&accs);//accepting the sockad structure
                        if(saccept==INVALID_SOCKET)//if acceptin is failed
                         {
                          int msgaccept = MessageBox(Handle,L"INVALID_SOCKET",L"accept error",
                                                     MB_RETRYCANCEL|MB_ICONERROR);
                           switch(msgaccept)
                             {
                              case ID_RETRY:
                               Timer1->Enabled=true;
                               do
                               {
                               accs=::accept(sock,(sockaddr*)&sockadacc,&accs);//re-establishing the acception for sockad structure
 
                               } while(Timer1->Interval<5000);
                                break;
                               case ID_CANCEL:
                                break;
                             }
                         }
                         else //if acception is successfull
                          {
                           int recved = recv(saccept,(char*)&buf[0],buf->size(),0);//receiving the data from client
                            if(recved == -1)//if receiving is failed
                              {
                              int msgrcv = MessageBox(Handle,L"SOCKET_ERROR",L"recv erro",
                                                      MB_RETRYCANCEL|MB_ICONERROR);
                              switch(msgrcv)
                                  {
                                  case ID_RETRY:
                                   recved=::recv(sock,(char*)&buf[0],buf->size(),0);//re-establishing the recv
                                   break;
                                  case ID_CANCEL:
                                   break;
                                  }
                              }
 
                                buf->resize(recved);//Setting the size of buf
 
                            if((send(saccept,(char*)&bufsend,sizeof(bufsend),0))==SOCKET_ERROR)//if send is failed
                                  {
                                  int msgsend = MessageBox(Handle,L"SOCKET_ERROR",L"send error",
                                                           MB_RETRYCANCEL|MB_ICONERROR);
                                     ShowMessage(IntToStr(WSAGetLastError()));
                                      switch(msgsend)
                                        {
                                         case ID_RETRY:
                                          ::send(saccept,(char*)&bufsend,sizeof(bufsend),0);//re-establishing the send
                                          break;
                                         case ID_CANCEL:
                                          break;
                                        }
                                  }
                          }
 
                  }
                  ShowMessage(IntToStr(WSAGetLastError())); //Get last error from memory
   }
  shutdown(sock,SD_BOTH); //shutting down the sockets
  shutdown(saccept,SD_BOTH);
  WSACleanup(); //Cleaning up the WSA
  closesocket(sock); //closing the socket
  closesocket(saccept); //closing the socket
#undef PORT //Removing the port defination
#elif defined (linux) || defined (__linux) //for linux system
//linux OS's
#endif//OS Defs
}
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
26.02.2012, 18:56 #54
как всегда дело в мелочах - ошибка вот здесь
C++
1
2
3
4
5
6
7
8
9
sockaddr_in sockad={0}; //Structure for identification IP.PORT and etc... In sockad first argument will be 0
sockaddr_in sockadacc={0};//structure for client
sockad.sin_family = AF_INET; //family of sockad(address) will be Address Family Inet
sockad.sin_port   = htons(PORT);//port is defined as 80
sockad.sin_addr.S_un.S_addr   = inet_addr("0");//localhost server IP
WORD make=MAKEWORD(2,2);//make word, for WSAStartup
WSAStartup(make,&data);//WSAStartup
memset((void*)&sockad,0,sizeof(sockad));//Cleaning the sockad structure ----- RIGHT SOCKAD ERASED!!!!
memset((void*)&saccept,0,sizeof(saccept));//Cleaning the saccept structure
то есть вы очистили адрес сервер-сокета который до этого установили. кстати - вы англоязычный что ли)?
0
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
27.02.2012, 01:09  [ТС] #55
vxg,

Цитата Сообщение от vxg Посмотреть сообщение
то есть вы очистили адрес сервер-сокета который до этого установили.
Ето я вчера добовил, и до етого ето ошибка была...


Цитата Сообщение от vxg Посмотреть сообщение
кстати - вы англоязычный что ли)?
Ну типо того, не соовсем но ...
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
27.02.2012, 09:36 #56
у меня ваш код работает. тестовый клиент на котором проверял имеет код:
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
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
#include <string>
#include <iostream>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101) return -1;
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET) return -1;
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(2000);
    sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
    printf("wait for server...\n");
 
    while (true)
    {
        int connect_res = connect(s, (SOCKADDR *)&sa, sizeof(sa));
        if (!connect_res) break;
 
        Sleep(250);
    }
 
    printf("connected\n");
 
    char *msg = "qwerty";
    int len = strlen(msg);
    if (!send(s, msg, 6, 0)) return -1;
 
    char buffer[1024];
    int buffer_size = sizeof(buffer);
    int x = recv(s, buffer, buffer_size, 0);
    printf("message=%s\n", buffer);
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
ваш код с некоторыми изменениями (убраны буквы L в MessageBox потому что у меня Builder 6, убрано обнуление сокетов о котором я говорил, использован постоянный порт что бы не заморачиваться, убраны ветвления по ответу пользователя так как мне они не нужны, убран выброс окна с ошибкой так как оно мне не нужно, использован человеческий буфер вместо вектора):
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char buf[1024]; //char buf, for receiving the data
unsigned char bufsend[256] = "Hello world"; //char buf to be send
WSADATA data; //wsadata structure
SOCKET sock,saccept; //sockets
int bind,listen,chekconnect,accs;//define the return of bind, listen, chekconnect,accs for
                                                                 //check connections
sockaddr_in sockad={0}; //Structure for identification IP.PORT and etc... In sockad first argument will be 0
sockaddr_in sockadacc={0};//structure for client
sockad.sin_family = AF_INET; //family of sockad(address) will be Address Family Inet
sockad.sin_port   = htons(2000);//port is defined as 80
sockad.sin_addr.S_un.S_addr   = inet_addr("127.0.0.1");//localhost server IP
WORD make=MAKEWORD(2,2);//make word, for WSAStartup
WSAStartup(make,&data);//WSAStartup
  sock = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//Creating the socket
 
if(sock==INVALID_SOCKET)//if sock is not connected
  {
   ShowMessage(IntToStr(WSAGetLastError()));
          int msg = MessageBox(Handle,"INVALID_SOCKET","Socket error",MB_RETRYCANCEL|MB_ICONERROR);
 
   }
 
   else //if socket is created successfully
   {             const int on= 1;
                                 bind = ::bind(sock,(sockaddr*)&sockad,sizeof(sockad));//binding the socket
                                 if(bind == SOCKET_ERROR)//if binding is failed
                                  {
                                                  int msgbinderror = MessageBox(Handle,"SOCKET_ERROR","Bind error",
                                                                                                                MB_RETRYCANCEL|MB_ICONERROR);
                  }
                   listen = ::listen(sock,SOMAXCONN);//else if binding is successfully listening the socket
                                 if(listen==SOCKET_ERROR)//if listening the socket is failed
                                  {
                                   int msglistenerror = MessageBox(Handle,"SOCKET_ERROR","Listen error",
                                                                                                  MB_RETRYCANCEL|MB_ICONERROR);
                                  }
                                  else//if listening is succesfull
                                  {
                                  accs = sizeof(sockadacc);
                                   saccept = accept(sock,(sockaddr*)&sockadacc,&accs);//accepting the sockad structure
                                                if(saccept==INVALID_SOCKET)//if acceptin is failed
                                                 {
                                                  int msgaccept = MessageBox(Handle,"INVALID_SOCKET","accept error",
                                                                                                         MB_RETRYCANCEL|MB_ICONERROR);
                                                 }
                                                 else //if acception is successfull
                                                  {
                                                   int recved = recv(saccept,&buf[0],1024,0);//receiving the data from client
                                                        if(recved == -1)//if receiving is failed
                                                          {
                                                          int msgrcv = MessageBox(Handle,"SOCKET_ERROR","recv erro",
                                                                                                          MB_RETRYCANCEL|MB_ICONERROR);
                                                          }
 
 
                                                        if(send(saccept,&bufsend[0],sizeof(bufsend),0)==SOCKET_ERROR)//if send is failed
                                                                  {
                                                                  int msgsend = MessageBox(Handle,"SOCKET_ERROR","send error",
                                                                                                                   MB_RETRYCANCEL|MB_ICONERROR);
                                                                         ShowMessage(IntToStr(WSAGetLastError()));
                                                                  }
                                                  }
 
                                  }
   }
  shutdown(sock,SD_BOTH); //shutting down the sockets
  shutdown(saccept,SD_BOTH);
  WSACleanup(); //Cleaning up the WSA
  closesocket(sock); //closing the socket
  closesocket(saccept); //closing the socket
}
Добавлено через 1 минуту
кстати. закрытие сокетов должно производится до закрытия библиотеки
1
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
29.02.2012, 01:22  [ТС] #57
vxg,
Спасибо, а что у меня стреслос ((

Всегда так.... На ХР чтото, всегда не работает...

Собераюс 7 установить ((
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
29.02.2012, 07:58 #58
на хр тоже должно работать. ошибка как было сказано крылась в обнулении адреса. ну и с буфером передачи у вас были неточности, тоже могло повлиять через выход за границы объекта
1
Programmer.
Прогер
631 / 262 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
29.02.2012, 09:22  [ТС] #59
vxg,
Блин, даже в консол переписал, и там тоже bind херачит...
Уже не то что думать а чем та, и кушать не могу... (
Вилетает: "bind function error: SOCKET_ERROR"
А WSAGetLastError показывает(10048)
Вот код в консоль:
Вот закоментированный код, легко понять
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
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <winsock2.h>
#include <stdio.h>
#include <iostream.h>
#define PORT 100//initialization of PORT
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
WORD makeword;//unsigned short(WORD) for MAKEWORD
WSADATA wsad;//WSAData initialization
SOCKET sockets,sockacc;//sockets initialization
unsigned char bufrec[1024];//buffer for receiving the data
unsigned char bufsend[256] = "Hello world";//buffer for send
char wsaer;//WSAGetLastError buff
SOCKADDR_IN soin = {0};//sockaddr initialization
SOCKADDR_IN soac = {0};//sockaddr for accept
int bindc,listenc,acci,recvc,sendc,wsaerror;//checking parameters
soin.sin_family = AF_INET;//addres family socket
soin.sin_port   = htons(PORT);//port for socket
soin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//IP address for socket
makeword = MAKEWORD(2,2);//making word
 WSAStartup(makeword,&wsad);//startup the WSA
 sockets = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//creating the socket
  if(sockets == INVALID_SOCKET) printf("socket function error: INVALID_SOCKET.\n"); //if creation of socket is failed, printf
   else//if socket is created successfylly
    {
      bindc = bind(sockets,(sockaddr*)&soin,sizeof(soin)); //binding the socket
      if(bindc == SOCKET_ERROR) printf("bind function error: SOCKET_ERROR.\n"); //if bindig failed, printf
        else//if binding successfully completed
         {
           listenc = listen(sockets,SOMAXCONN);//listening the socket
           if(listenc == SOCKET_ERROR) printf("listen function error: SOCKET_ERROR");//if fail listening, printf
            else//if listening is successful
             {
              acci=sizeof(soac);//sizeof soac
              sockacc = accept(sockets,(sockaddr*)&soac,&acci);//accepting the socket from the server
               if(sockacc == INVALID_SOCKET) printf("accept funtion error: INVALID_SOCKET"); //if acception failed, printf
                else//if acception is successfully completed
                 {
                  recvc = recv(sockacc,&bufrec[0],sizeof(bufrec),0);//receiving data from server
                   if(recvc == -1) printf("recv function error: SOCKET_ERROR");//if receiving is failed, printf
                    else//if received successfully
                     {
                       sendc = send(sockacc,(const char*)&bufsend,sizeof(bufsend),0); //sending some data to the server
                       if(sendc == SOCKET_ERROR) printf("send function error: SOCKET_ERROR");//if cant send data, printf
                     }//received
                 }//accepted
             }//listened
         }//binded
                  wsaerror = WSAGetLastError();//Getting last error in the buffer
          printf("Error is: %d.\n",wsaerror);//printing the error code
      shutdown(sockets,SD_BOTH);//shutting down the socket
      shutdown(sockacc,SD_BOTH);//shutting down the socket
      WSACleanup();//cleaning up the WSA
      closesocket(sockets);//closing the main socket
      closesocket(sockacc);//closing the acception socket
        }
    system("pause");
    return 0;
}
Добавлено через 4 минуты
Ого, шас порт изменил на 100, как будто ждет чегота...

вышло?
Радоватся или нет?
0
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
29.02.2012, 23:04 #60
наверное останавливается на ресиве и данные ждет
0
29.02.2012, 23:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.02.2012, 23:04
Привет! Вот еще темы с решениями:

Адаптер функции bind()
Читаю у Липпмана про адаптер bind, ...какие-то знакоместа. Компилятор на них...

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

WinSock выдает ошибку при вызове функции bind
исходный код (взять ОТСЮДА почти полностью, &quot;пример реализации TCP сервера&quot;) ...

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


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

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

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