Комментарий к Статье Полное руководство по сетевому программированию для разработчиков игр. Часть 4. TCP
Четвертая часть руководства рассказывает о передаче данных по протоколу TCP. Рассматриваются взаимодействия сервера и клиента с примерами исходного кода.
как всегда полезно и интересно..
see gametutorials.com->networking
HL2 leaked alpha
Neonic
?
Либо там придумывать уже нечего, либо ещё что...да только я взял код, немного его модернизировал, а чуть позже ко мне попала HL2 leaked alpha. Исходники, ессно. Что интересно, названия, основные типы и ещё во многих местах в коде обнаружились совпадения. Стал смотреть - откуда, вспомнил про статью, с которой всё началось. Не спорю, в альфе код весьма хорош...
Neonic
Cool :), фишка в том, что к четвертой части нету кода...
Хотя на момент, когда я прислал wat'у статьи, исходники hl2 еще не были сперты... Однако такое совпадение мне льстит ;)
P.S. (А вдруг valve заюзала код с этого сайта? гыгы :))
x84
да точно! гады
x84
так ты с Вальва можешь стребовать за то, что твой проприетарный код украли вместе с остальными сорцами.
x84
На самом деле всё проще... как мне думается. Вальв тесно сотрудничает с мелкомягкими... MSDN содержит точно такие же названия, просто Вальв оптимизировали работу сетевого кода под свои нужды, не меняя названий... Ты ж вроде тоже не методом тыка учился? Наверняка по MSDN либо книжице-аналогу
Neonic
Это была шутка юмора :))
А если серьезно, то в принципе неудивительно, что метод отсылки называется send, приема - recv, подключения - connect, и т.п. ;) Просто дословный перевод слов, которые первыми приходят на ум.
Даешь продолжение! -)
Может кто подскажет как решить проблему?
Я создаю сокет:
if((sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)
{
cout<<"Socket is invalid"<<endl;
getch();
return;
}
unsigned short port = 110;
hostent *host;
host = gethostbyname("tut.by");
socketaddr.sin_family = PF_INET;// èëè AF_INET
socketaddr.sin_addr.s_addr = (u_char)host->h_addr;
socketaddr.sin_port = htons(port);
коннекчусь:
int size = sizeof(sockaddr_in);
sock = connect(sock,(struct sockaddr*)&socketaddr,size);
if (sock != SOCKET_ERROR )
cout <<"Connection is successful"<<endl;
else
{
cout<<"Error in sock_connect()"<<endl;
ErrorInfo();
closesocket(sock);
}
все проходит удачно, сокет коннектицца
потом я пытаюсь послать что-нибудь:
int result=send(sock,"HELO USER",sizeof("HELO USER"),0);
if( result==SOCKET_ERROR )
{
cout<<"Error"<<endl;
ErrorInfo();
closesocket(sock);
return ;
}
вобщем WSAGetLastError() возвращает мне ошибку - дескриптор не я является дескриптором сокета.
ПОдскажите как рещить проблему.
Polupoker
>Может кто подскажет как решить проблему?
Исправлю твой код:
коннекчусь: int size = sizeof(sockaddr_in); if ( connect( sock,( struct sockaddr*)&socketaddr,size) != SOCKET_ERROR ) cout <<"Connection is successful"<<endl; else { cout<<"Error in sock_connect( )"<<endl; ErrorInfo( ); closesocket( sock); }
Ошибка была тут:
sock = connect(sock,(struct sockaddr*)&socketaddr,size);
if (sock != SOCKET_ERROR )
cout <<"Connection is successful"<<endl;
Ты присваиваешь переменной, в которой хранится дескриптор сокета, значение, возвращенное из connect, что равносильно тому, что ты просто потерял свой дескриптор... Ты присвоил переменной sock то, что вернула функция connect, и потом пытаешься использовать это значение, как дескриптор... Но функция connect не возвращает дескрипторов сокетов, она возвращает лишь число, которое сигнализирует о том, успешно ли эта функция выполнилась... И connect вполне аргументированно говорит, что это число - "invalid socket descriptor"...
Да, эт я грамотно профтыкал. Большое спасибо.
Тема в архиве.