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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создадим консольное приложение, с применением ООП 
:(
    Опции темы
Sergio
  Дата 21.1.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Здраствуйте. Хочу продолжить тему по ТСП протоколу. Вот моя функция которая создаёт сокет:

Код
WSADATA wsa;                                                // Info about winsock
    WSAStartup(MAKEWORD(1,0), &wsa);                           
    SOCKET mySocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 

     sockaddr_in AdressInfo;
     AdressInfo.sin_family = AF_INET;
     AdressInfo.sin_port = 4888;
     AdressInfo.sin_addr.s_addr=htonl(INADDR_ANY);

     bind(mySocket, (SOCKADDR*)&AdressInfo), sizeof(AdressInfo);


Что то с биндом не так.. smile 
error C2660: 'bind' : function does not take 2 arguments 

Спасибо.
P.S.  htonl(INADDR_ANY)   что это? smile 


Это сообщение отредактировал(а) Sergio - 21.1.2007, 00:32
PM MAIL ICQ   Вверх
nworm
Дата 21.1.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sergio @ 21.1.2007,  00:29)
Код

     bind(mySocket, (SOCKADDR*)&AdressInfo), sizeof(AdressInfo);


Что то с биндом не так.. smile 
error C2660: 'bind' : function does not take 2 arguments 

 smile  Скобка после AdressInfo явно лишняя.
PM MAIL WWW   Вверх
Romikgy
Дата 21.1.2007, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(Sergio @  20.1.2007,  23:29 Найти цитируемый пост)
htonl(INADDR_ANY)   что это?

любой адрес, так и написано smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
nworm
Дата 21.1.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM MAIL WWW   Вверх
Sergio
Дата 21.1.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



nworm, вот написал так:
Код
bind(mySocket, (SOCKADDR*)&AdressInfo, sizeof(AdressInfo);


Ошибка: error C2143: syntax error : missing ')' before ';'
PM MAIL ICQ   Вверх
nworm
Дата 21.1.2007, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пробый так
Код

 bind(mySocket, (SOCKADDR*)&AdressInfo, sizeof(AdressInfo));

PM MAIL WWW   Вверх
SparF
Дата 21.1.2007, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

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



ну так он тебе и написал:
"Поставь, пожалуйста, скобку перед ;" )))


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
Sergio
Дата 21.1.2007, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



 Хотел проверить возращаемые ошибки Вызвал две "прослушки" сразу но они вернули два нуля. Почему? А должно ведь вернуть ноль и значение ошибки.


Код
cout<<listen(mySocket, 5);
     cout<<listen(mySocket, 10);



PM MAIL ICQ   Вверх
SparF
Дата 21.1.2007, 03:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

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



Sergio, а почему обязательно ошибку?
вот, что в man listen сказано
Цитата

     Listen() will fail if:

     [EBADF]            The argument s is not a valid descriptor.

     [ENOTSOCK]         The argument s is not a socket.

     [EOPNOTSUPP]       The socket is not of a type that supports the opera-
                        tion listen().




--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
Sergio
Дата 21.1.2007, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Есть ещё такое возращение:

Код
WSAEISCONN — сокет уже подключен.


PM MAIL ICQ   Вверх
SparF
Дата 21.1.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

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



сейчас посмотрим

Это сообщение отредактировал(а) SparF - 21.1.2007, 09:33


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
SparF
Дата 21.1.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

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



Sergio, а ты под какую ОС пишешь? Я про то, что в мсдн нашел про WSAEISCONN =)
а потом решил покопаться в Линухе на эту тему, результаты меня не только откровенно порадовали, но еще и удивили  :hehe - зацепило))
1. в Линухе как факт отсутствует ошибка WSAEISCONN, а есть EISCONN
2. EISCONN вызывается в случае:
для функции connect:
Код

1244    if (sock->state != SS_UNCONNECTED)
1245            return -EISCONN;

аналогично для  send_msg:
Код

468                 if (sock->state != SS_UNCONNECTED)
469                         return -EISCONN;

И других вариантов встретить его в socket.c нет  :p 
3. сам же код ошибки  (Linux/include/asm-generic/errno.h)
Код

79 #define EISCONN         106     /* Transport endpoint is already connected */

4. Что же касается работы конкретно функции listen то вызывается одна из asmlinkage long sys_socketcall(Linux/net/socket.c), как и полностью все функции работы с сокетами вот кусок кода (нас интересуют возвращаемые ошибки)
Код

1970 asmlinkage long sys_socketcall(int call, unsigned long __user *args)
1971 {
...
1976         if(call<1||call>SYS_RECVMSG)
1977                 return -EINVAL;
1978 
1979         /* copy_from_user should be SMP safe. */
1980         if (copy_from_user(a, args, nargs[call]))
1981                 return -EFAULT;
1982 
1983         err = audit_socketcall(nargs[call]/sizeof(unsigned long), a);
1984         if (err)
1985                 return err;
...
1990         switch(call) 
1991         {
...
2001                 case SYS_LISTEN:
2002                         err = sys_listen(a0,a1);
2003                         break;
...
2048         }
2049         return err;
2050 }

по возможным ошибкам:
(include/asm-generic/errno-base.h)
Код

17 #define EFAULT          14      /* Bad address */
...
25 #define EINVAL          22      /* Invalid argument */

с первой ошибкой тут все ясно(первая - в порядке проверки, а не объявления в errno-base.h))
вторая же возникает если некорректно отрабатывает копирование блока данных из пространства пользователя (тоже вряд ли имеет отношение к нашему вопросу )))

если смотреть дальше по коду(Linux/kernel/auditsc.c), то единсвенное, что может вернуть audit_socketcall это
Код

15 #define ENOMEM          12      /* Out of memory */

значит нам опять же не сюда)))
остается только одна функция, которая как-то может повлиять на ошибку: sys_listen (net/socket.c, line 1362)
она совсем маленькая:
Код

1360 int sysctl_somaxconn = SOMAXCONN;
1361 
1362 asmlinkage long sys_listen(int fd, int backlog)
1363 {
1364         struct socket *sock;
1365         int err, fput_needed;
1366         
1367         if ((sock = sockfd_lookup_light(fd, &err, &fput_needed)) != NULL) {
1368                 if ((unsigned) backlog > sysctl_somaxconn)
1369                         backlog = sysctl_somaxconn;
1370 
1371                 err = security_socket_listen(sock, backlog);
1372                 if (!err)
1373                         err = sock->ops->listen(sock, backlog);
1374 
1375                 fput_light(sock->file, fput_needed);
1376         }
1377         return err;
1378 }

тут только два варианта, откуда может появиться ошибка
первый: security_socket_listen (include/linux/security.h, line 2703)
Код

715  * @socket_listen:
716  *      Check permission before socket protocol layer listen operation.
717  *      @sock contains the socket structure.
718  *      @backlog contains the maximum length for the pending connection queue.
719  *      Return 0 if permission is granted.

по комменту понятно - проверяет права на доступ (опять же - похоже, что "не та степь" по отношению к нашему вопросу)
второй:
(net/tipc/socket.c, line 1299):
Код

1299 static int listen(struct socket *sock, int len)
1300 {
1301         /* REQUIRES SOCKET LOCKING OF SOME SORT? */
1302 
1303         if (sock->state == SS_READY)
1304                 return -EOPNOTSUPP;
1305         if (sock->state != SS_UNCONNECTED)
1306                 return -EINVAL;
1307         sock->state = SS_LISTENING;
1308         return 0;
1309 }

как видишь она может вернуть только две ошибки (include/asm-generic/errno.h, line 68):
Код

68 #define EOPNOTSUPP      95      /* Operation not supported on transport endpoint */

это была первая, EINVAL описана выше.
при этом первая вызывается если sock->state== (Linux/net/tipc/socket.c):
Код

59 #define SS_READY        -2      /* socket is connectionless */

по комменту ясно, что это "если сокет (в силу каких-то причин) не может быть подключен"
а вторая если sock->state!= (Linux/include/linux/net.h)
Код

51         SS_UNCONNECTED,                 /* unconnected to any socket    */

опять же по комменту видно, что если сокет уже к чему-то подключен

Коды ошибок, указанных мной ранее из мана в коде listen я так и не нашел - люди, не судите строго  :rolleyes
Так что, имхо, не все так просто, как хотелось бы, но и усложнять лишний раз не надо. 
Думаю, что этого достаточно, чтобы понять: в зависимости от ОС реализация вроде бы "стандартных" функций может меняться))) как же это сделано в винде - а хз)) не знаю (

PS http://lxr.linux.no/ однозначно рулит  :inlove 
ковырялся в исходниках 2.6.17.13 
гы...прикольно :happy 


Цитата(Sergio @  21.1.2007,  02:27 Найти цитируемый пост)
 Хотел проверить возращаемые ошибки Вызвал две "прослушки" сразу но они вернули два нуля. Почему? А должно ведь вернуть ноль и значение ошибки.

Так что забей ))) исходить надо из того, что есть
если же пишешь под винду - то тайна остается покрыта мраком :( тут надо спрашивать у продвинутых виндузойдов, коим я не являюсь  :(
А, вот еще - на опытных прогах я все это не проверял, возможно, что в реальности еще что-то накладывается.

Это сообщение отредактировал(а) SparF - 21.1.2007, 11:01


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
drZmeu
Дата 21.1.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Народ да посоветуйте ему книжку какую нить... 
Sergio -> С++ Глазами хакера... В нете скачай примерный вес 3 мегобайта... Там много чего про сокеты и т.д
Удачи тебе. 
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
SparF
Дата 21.1.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

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



мда....а то я что-то размахнулся....
вот ссылка, которая меня ну очень в свое время порадовала (вообще класс!)
http://beej.us/guide/bgnet/



--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
Sergio
Дата 21.1.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



 Почитал я книгу. И вот что у меня получилось (не очень получилось smile ) . Самый примитивный сервер. Подскажите может что-то не неправильно, тогда подкоректируйте. Он даже не выводит буфер.Только принимает.

Код
using namespace std;
    WSADATA wsa;                                                // Info about winsock2
    char    szRecvBuff[1024];

    WSAStartup(MAKEWORD(1,0), &wsa);                            // Loading library winsock2
    SOCKET mySocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);    // Создание сокета
      

     sockaddr_in AdressInfo;
     AdressInfo.sin_family = AF_INET;                           // Internet technology (TCP,UDP etc)
     AdressInfo.sin_port = htons(4888);
     AdressInfo.sin_addr.s_addr=htonl(INADDR_ANY);

     bind(mySocket, (SOCKADDR*)&AdressInfo, sizeof(AdressInfo));  //Связывание даных с сокетом
     
     listen(mySocket, 5);                                         // Прослушка

     int AdressInfoSize = sizeof(AdressInfo);

     while(1) {
    
         accept(mySocket,(SOCKADDR*)&AdressInfo,&AdressInfoSize);
          cout<<recv(mySocket, szRecvBuff, 1024, 0);     
     }    

Простите за нечитабельность(писал в 4 утра).

SparF, я пишу под виндовс.

P.S. Подскажите где в структуре sockaddr_in указывается IP. Спасибо зарание.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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