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 ) | Хотел проверить возращаемые ошибки Вызвал две "прослушки" сразу но они вернули два нуля. Почему? А должно ведь вернуть ноль и значение ошибки. |
Так что забей ))) исходить надо из того, что есть если же пишешь под винду - то тайна остается покрыта мраком :( тут надо спрашивать у продвинутых виндузойдов, коим я не являюсь :( А, вот еще - на опытных прогах я все это не проверял, возможно, что в реальности еще что-то накладывается. |