Методом проверки ошибок выяснил, что ошибка ещё в bind, причём непонятно какая, в man 2 bind её нет.
Mike Nerevarin
не знаю как в линухе.. не кодил сокеты... но в винде надо бы зделать инициализацию сокетов WSAStartup();
unsigned
Для Линукса это делать не надо, и тогда он ругался бы на сокет, а не на привязку. тут или что-то в моей системе не то, или с addr напортачил, как-то не так...
Но в общем случае статья фиговая, ибо нихрена из неё не работает.
У меня вот какая проблема: вот частичный листинг сервера-
...
WORD winsock_version;
WSADATA winsock_data;
int winsock_error;
SOCKET TCPsd;
winsock_version=MAKEWORD(2, 0);
winsock_error=WSAStartup(winsock_version,&winsock_data);
if(winsock_error!=0)
{
printf("Could not initialize winsock");
exit(1);
}
else
{
TCPsd=socket(PF_INET,SOCK_STREAM,0);
if(TCPsd==INVALID_SOCKET)
{
winsock_error=WSAGetLastError();
printf("Could not create a socket. Error code: %d\n",winsock_error);
exit(1);
}
}
printf("Server is up\n");
printf("TCP Socket Descriptor: %d \n",TCPsd);
int error,ncon=10;
error=(listen(TCPsd,ncon));
if(error!=0)
printf("TCP Socket [SD: %d] listening filed.\n",TCPsd);
...
Так вот. Проблема в том, что listen(TCPsd,ncon) постоянно возвращает ошибку=(( Никак не могу понять в чем проблема.
n0klin
bind - RTFM
??? не понял=)
Кстати, а после 4-ой части продолжения не было?
n0klin
The following example demonstrates the use of the listen function.
#include <stdio.h> #include "winsock2.h" void main() { //---------------------- // Initialize Winsock WSADATA wsaData; int iResult = WSAStartup( MAKEWORD( 2,2), &wsaData); if ( iResult != NO_ERROR) printf( "Error at WSAStartup()\n"); //---------------------- // Create a SOCKET for listening for // incoming connection requests. SOCKET ListenSocket; ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP); if ( ListenSocket == INVALID_SOCKET) { printf( "Error at socket(): %ld\n", WSAGetLastError( )); WSACleanup( ); return; } //---------------------- // The sockaddr_in structure specifies the address family, // IP address, and port for the socket that is being bound. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr( "127.0.0.1"); service.sin_port = htons( 27015); if ( bind( ListenSocket, ( SOCKADDR*) &service, sizeof( service)) == SOCKET_ERROR) { printf( "bind() failed.\n"); closesocket( ListenSocket); return; } //---------------------- // Listen for incoming connection requests // on the created socket if ( listen( ListenSocket, SOMAXCONN ) == SOCKET_ERROR) printf( "Error listening on socket.\n"); printf( "Listening on socket...\n"); WSACleanup( ); return; }
Отличный гид, всё понятно, но есть один недостаток - он не доделан. Очевидно, что автор упоминал о пятой части, но вот найти её не могу...
Автор хоть и классно изложил материал, но один критический момент он всегда упускал и откладывал... Блокирующие функции, ставящие программу "на обе лопатки" пока не дойдет ответ, вот собственно и прошу у добрых, знающих людей помощи, как обойти эту проблему?...
Занялся работой с сетью(на данный момент полный нуб в этой сфере). В статье описывается только "начало" работы - блокирующие сокеты не очень то юзабельны.
От сети мне требуется:
- нужно написать простенькую оболочку над функциями чтобы получилось примерно следующее: сетевай код постоянно принимает данные из сети и пишет их буферы (у каждого сокета свой буфер в котором храниться пришедшая информация). Получаю информацию из буферов с помощью функций похожих на `getNext4bytes()` `getNextByte()`
- сервер в состоянии работать с большим кол-вом клиентов (ММО, 2к+ клиентов)
посоветуйте пожалуйста статейки или информацию (технологии) с помощбю которых можно реализовать вышеизложеное. Муторно немножко написано, надеюсь поймете )))
Как получить свой адрес для бинда? Я раньше писал сетевые vcl проги, так там серверу достаточно было позаботиться только о номере порта, а клиенту нужен был адрес только серверного сокета, но не своего. А на API какой адрес в бинд пихать, если меня не устраивает случайный номер порта?
Тема в архиве.