Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
1

Сокет сервер: bind() постоянно возвращает (-1)

18.08.2009, 18:51. Показов 5424. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет !

Вот значит делаю сокет сервер
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
#include <iostream.h>
#include "Winsock2.h"
 
 
 
void main(){
 
      
    
 
 
    WSADATA WsaData;
    int err = WSAStartup (0x0101, &WsaData);
    
    
 
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(5190);
    
    int sd;
    if( sd = socket(AF_INET, SOCK_STREAM, 0) == -1){
 
      cout << "Error -- socket()" << "\n";
 
    }
 
 
 
    if (int i = bind(sd, (struct sockaddr *)&addr, sizeof(addr)) == -1){
        
        cout << "Error -- bind()" << "\n";
    }
    
        
    
}
функция bind() постоянно возвращает -1

Как узнать что ей нехватает ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2009, 18:51
Ответы с готовыми решениями:

Почему если я задаю IP 127.0.0.1 то bind возвращает 0, а если задаю IP в сети, то bind возвращает -1
IP узнаю через 2IP.ru вот и если задаю полученный IP, то программа вылатает когда выполняется...

Unable to bind address на Unix-сокет
то на чем все : vds ubuntu server 16.04, nginx+php7.0-fpm При вызове функции socket_bind или...

mysqli_insert_id не возвращает ID вставленной записи, постоянно возвращает "1".
Есть запрос такой расчитываю через insert_id получить id добавленной книги, но почему-то возвращает...

Sockets, сервер вылетает при Bind-е
пытаюсь создать серв: Int64 ip64=Convert::ToInt64(mysock-&gt;ip); //mycosk-&gt;ip: &quot;127001&quot;...

15
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
18.08.2009, 19:33 2
Цитата Сообщение от malik555 Посмотреть сообщение
функция bind() постоянно возвращает -1

Как узнать что ей нехватает ?
Читать доку пробовал?
http://msdn.microsoft.com/en-u... S.85).aspx
0
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
18.08.2009, 20:50  [ТС] 3
пробывал - но я все правельно делаю !

Добавлено через 1 час 13 минут 6 секунд
Читать доку пробовал?
http://msdn.microsoft.com/en-u... S.85).aspx
Спасибо и правда помогает !

Но тут другая проблемка

вот значит если делаю так
C++
1
2
3
           SOCKET AcceptSocket;
           AcceptSocket = accept( ListenSocket, NULL, NULL );
           cout << "new client";
В консоле показывает что подключился новый клиент .

А если ставлю в цыкл - например
C++
1
2
3
4
5
6
7
 for(;;){
 
           SOCKET AcceptSocket;
           AcceptSocket = accept( ListenSocket, NULL, NULL );
           cout << "new client"; 
 
}
То в кансоль уже не выводится cout << "new client"; при подключении клиента - а почему так ?
0
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
18.08.2009, 21:35 4
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
DWORD WINAPI NetThread(LPVOID lpParam)
{
    SOCKET        sServerListen,
                  sClient;
    struct sockaddr_in localaddr,
                       clientaddr;
    HANDLE        hThread;
    DWORD         dwThreadId;
    int           iSize;
 
    sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (sServerListen == SOCKET_ERROR)
    {
        MessageBox(0, "Can't load WinSock", "Error", 0);
        return 0;
    }
    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(5050);
 
    if (bind(sServerListen, (struct sockaddr *)&localaddr, 
            sizeof(localaddr)) == SOCKET_ERROR)
    {
        MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }
    
    MessageBox(0, "Bind OK", "Error", 0);
 
    listen(sServerListen, 4);
 
    MessageBox(0, "Listen OK", "Error", 0);
    while (1)
    {
        iSize = sizeof(clientaddr);
        sClient = accept(sServerListen, (struct sockaddr *)&clientaddr,
                        &iSize);        
        if (sClient == INVALID_SOCKET)
        {        
            MessageBox(0, "Accept filed", "Error", 0);
            break;
        }
 
        hThread = CreateThread(NULL, 0, ClientThread, 
                    (LPVOID)sClient, 0, &dwThreadId);
        if (hThread == NULL)
        {
            MessageBox(0, "Create thread filed", "Error", 0);
            break;
        }
        CloseHandle(hThread);
    }
    closesocket(sServerListen);
    return 0;
}
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
19.08.2009, 14:31 5
Цитата Сообщение от malik555 Посмотреть сообщение
То в кансоль уже не выводится cout << "new client"; при подключении клиента - а почему так ?
accept ждет клиента. значит клиент просто не конектится. И после вызова accept нужно проверять ошибки. Опять же читаем доку :-)
Программирование - это 20% действий и 80% обработка ошибок.
0
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
23.08.2009, 11:18  [ТС] 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
/*  #- Initialize Winsock     -# */
              WSADATA wsaData;
              int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
              if (iResult != NO_ERROR){
              printf("Error at WSAStartup()\n");
              exit(0);
              }
  
/*  #-  socket()                                          -# */
              SOCKET ListenSocket;
              ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
              if (ListenSocket == INVALID_SOCKET) {
              printf("Error at socket(): %ld\n", WSAGetLastError());
              exit(0);
              }
 
/*  #-  service                                           -# */
              sockaddr_in service;
              service.sin_family = AF_INET;
              service.sin_addr.s_addr = inet_addr("127.0.0.1");
              service.sin_port = htons(5190);
 
/*  #-  bind()                                            -# */
              if (bind( ListenSocket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR) {
              printf("bind() failed.\n");
              closesocket(ListenSocket);
              exit(0);
              }
  
/*  #-  listen                                            -# */
              if(listen( ListenSocket, SOMAXCONN ) == SOCKET_ERROR){
              printf("Error listening on socket.\n");
              exit(0);
              }
        
          
                                    SOCKET client;
 
              for(;;){
 
                                              client = accept( ListenSocket, NULL, NULL );
                  
                                              if (client == INVALID_SOCKET)
                                                 {        
                                                   MessageBox(0, "Accept filed", "Error", 0);
                                                   break;
                                                 }
   
              }
Но тут маленькая проблема этот сервер не может обслужевать клиента и постоянно принимать от него данные - это понятно так как accert() ждет новых подключений .

В linux я после accert() создавал копию процеса fork() и уже в другом процесе прослушивал сокет recv()

А в win32 что-то не пойму как эта мпогопоточность реализовать !
0
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
25.08.2009, 16:27 7
Цитата Сообщение от malik555 Посмотреть сообщение

А в win32 что-то не пойму как эта мпогопоточность реализовать !
а ты читаешь что тебе отвечают?
вроде и код полный выложил сервера...
CreateThread ищи в коде и будет щастье
0
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
27.08.2009, 17:15  [ТС] 8
Цитата Сообщение от oxotnik Посмотреть сообщение
а ты читаешь что тебе отвечают?
вроде и код полный выложил сервера...
CreateThread ищи в коде и будет щастье

Спасибо буду внимательнее !

С этим уже разобрался , еще вопрос

как определить ip адрес клиента который приконектился ?
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
27.08.2009, 18:19 9
доку по параметрам accept прочитать
0
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
27.08.2009, 18:45  [ТС] 10
Цитата Сообщение от Alexandoros Посмотреть сообщение
доку по параметрам accept прочитать
Другого я от тебя и не ждал !
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
27.08.2009, 19:00 11
Ничего, я верю, что в один прекрасный день, ты её таки сначало прочитаеш, а потом вопросы задавать будеш. ;-)
0
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
27.08.2009, 19:08  [ТС] 12
Цитата Сообщение от Alexandoros Посмотреть сообщение
Ничего, я верю, что в один прекрасный день, ты её таки сначало прочитаеш, а потом вопросы задавать будеш. ;-)
http://msdn.microsoft.com/en-u... S.85).aspx

вот читаю за accep() но там нечего не сказанно за ip !
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
27.08.2009, 19:59 13
Второй параметр __out struct sockaddr* addr,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;           /// ПОРТ
        struct  in_addr sin_addr;  /// АДРЕС IP
        char    sin_zero[8];
};
 
 
typedef struct in_addr 
{  
    union 
    {    
          struct 
          {      u_char s_b1,s_b2,s_b3,s_b4;    } S_un_b; ///АДРЕС IP ПО БАЙТАМ
          struct 
         {      u_short s_w1,s_w2;    } S_un_w;    
         u_long S_addr;  
    } S_un;
} IN_ADDR,  *PIN_ADDR,  FAR *LPIN_ADDR;
Ты ж не анекдоты читай, да?
0
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
27.08.2009, 21:28  [ТС] 14
C++
1
2
3
4
5
6
client = accept( ListenSocket, NULL, NULL );
 
int len = sizeof(service);
int i = getpeername(client,(SOCKADDR*) &service,&len);
 
cout << "ip = " << inet_ntoa(service.sin_addr);
И будет счастье !
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
28.08.2009, 15:35 15
Цитата Сообщение от malik555 Посмотреть сообщение
Код
int len = sizeof(service);
int i = getpeername(client,(SOCKADDR*) &service,&len);
И будет счастье !
Это лишнее. Во втором параметре accept уже приходит SOCKADDR.

Но герои не ищут легких путей!
0
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
05.09.2009, 02:59 16
Всем привет, решил написать программу с winsocket, но возникли вопросики 1)порт для работы можно указывать любой, даже который уже используется? 2)если нет, то как узнать через какой порт точно будет работать? 3)и еще...для выполнения теста я могу сервер и клиент создавать на одной лок машине? Всем заранее спасибо )
0
05.09.2009, 02:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2009, 02:59
Помогаю со студенческими работами здесь

Как заставить сокет клиента слушать данные с сервера постоянно?
есть такой клиент import android.os.AsyncTask; import...

Сервер сокет
На этот раз я не спрашиваю, а прошу проверить на правильность. type _clients=record ...

Сокет Сервер
Всем доброго времени суток! Нужна помощь! Вообщем нужно написать сокет сервер - клиент, почитав...

сокет сервер
&lt;?php header('Content-type: text/html; charset=windows-1251'); set_time_limit(0); ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru