| ковыряние сорсов 39dll |
|
3bl3gamer
| Дата: Четверг, 18.03.2010, 20:49 | Сообщение # 1 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
решил сделать что-нибудь сетевое (да хоть просто чат) на с++. в ГМе соответствующие примерчики "щупал", въезжал, примерно понимал. решил не длл к проекту подключить, а сами сорсы. вроде подключил... подключил соответствующие библиотеки... всё компилится, ошибок нет. начал делать сервер... и споткнулся на первом же шаге. tcplisten, гад не работает! точнее работает, но возвращает -1. начал копать сорсы, нашёл, что tcplisten начанается с Code if((sockid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return false; в этой строке и загвоздка. socket всегда возвращает INVALID_SOCKET. почему, понять не могу... пробовал не подключать сорсы 39длл, просто вставил в свой проект эту строчку. неа, всё равно не хочет, INVALID_SOCKET, и всё! как так?! длл через ГМ работает отлично.
|
| |
| | |
|
Ang3L
| Дата: Четверг, 18.03.2010, 22:41 | Сообщение # 2 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
3bl3gamer, если исходники предполагаются для использования пользователями, то к ней идёт подробная справка и подробные комменты к коду. Если таковых не наблюдается и ты не гуру C++, то копаться в исходниках не хилой программы (а я подозреваю что 39dll не маленькая) будет нетривиальной задачей. Quote (3bl3gamer) почему, понять не могу... В этом случае выделяешь эту строчку. Нажимаешь F9 - ставится точка останова. Запускаешь дебагер (F5). Ты не поверишь, но в Visual Studio есть хороший дебагер! И он немного лучше чем ГМовский. Программа останавливается напротив этой функций. Далее выбираем точку вхождения этой функций (Шаг с заходом - F11). Мы находимся внутри этой функций. Теперь смотрим локальные переменные (они должны быть где-то внизу, или Alt+4 должно помочь). Смотрим что пришло. Потом смотрим как это всё обрабатывается (Нажимая F10 для перехода на след. строчку или F11 для захода внутрь, если это необходимо). В конце смотрим "выхлоп". Блин! Тебе не нравится INVALID_SOCKET? И ты не разобрался почему он получается? Дык на выходе подставь любое другое значение! Просто наведи мышкой на уже проинициализируемую переменную и в открывшемся окне измени его, либо во всё том же окне - локальные переменные. Или же ты можешь изменить enum подставив нужные тебе значения. Это быстро и можно обойтись без дебагера, но это очень плохо, невежественно и не политкорректно. Поэтому я тебе этого не говорил...  Это лишь верхушка айсберга то что умеет делать встроенный дебагер, но тебе должно этого хватить на изучение. Да, и тебе нужно привыкнуть к стилю программированию на С++. Здесь в отличий от ГМ нужно много приготовительных работ, иногда больше чем сама программа. Поэтому socket() может не работать без других функций (допустим инициализирующих. Т.е. ты не можешь работать в той среде которую ещё не создал и это логично).
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Четверг, 18.03.2010, 23:34 | Сообщение # 3 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
Quote (Ang3L) Дык на выходе подставь любое другое значение! а чем это поможет-то? как я понял, оно выдаёт INVALID_SOCKET при какой-нибудь ошибке инициализации этого сокета. я и вручную могу if и return убрать могу, но чем мне это поможет, если корректно оно не проинициализировалось? Quote (Ang3L) Поэтому socket() может не работать без других функций (допустим инициализирующих. вот как начинается код сервера в ГМе: Code dllinit(0,true,false) port = 14804 listen = tcplisten(port, 16, true) dllinit я смотрел, там одни external_define (ну и проверок несколько). а дальше идёт этот самый tcplisten. то есть функций, инициализирующих что-то внутри длл вроде-то и нет. потому я и взялся за tcplisten. а "socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)" - это, по-моему, вообще функция из какой-то lib'ы. Добавлено (18.03.2010, 23:34) --------------------------------------------- хм. пояндексил, нашёл, что надо в начале ещё WSAStartup вставить. да, теперь ошибки нет. пока. странно, а когда ж 39длл делает этот стартап...
|
| |
| | |
|
Ang3L
| Дата: Четверг, 18.03.2010, 23:44 | Сообщение # 4 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Пятница, 03.09.2010, 18:11 | Сообщение # 5 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
да, спасибо, самое оно!  Добавлено (03.09.2010, 18:11) --------------------------------------------- чтоб темы не плодить, решил написать сюда же. со всем вышеописанным вроде разобрался... в марте ещё. щас новая проблема. есть сервер и клиент. сервак создает N шариков, обсчитывает их взаимодействие и отправляет координаты(х и у) и скорости(по вертикали и горизонтали) клиенту. координаты и скорости - float'ы, т.е. на каждую точку приходится по 16 байт. отправляется оно путём запихивания всех данных в буфер и отправки N*16 байт этого буфера. в чём, собсна, проблема: если точек меньше 274, всё ок, но если их 274 или больше, клиент за один раз (один recv) принимает НЕ всё данные, остальные принимаются вторым recv'ом. буферы приёма и отправки по 16кбайт. а) почему так? б) тестировал всё это на одном компе и вот интересно: всегда ли 273*16 байт будут отправляться за один раз, или это зависит от железа(или ещё чего)?
|
| |
| |
|
|