Решил попрактиковаться в работе с сетью и с сокетами,
выбор мой пал на создание примитивного mail.ru агента,
консольное приложение,которое может хотя бы могло законнектится к серверу,
и пройти авторизацию юзера.Сейчас опишу,как и что делаю.
Сначала подключаю winsock.2 и подгружаю библиотеку ws2_32.Lib
адрес и порт,по которому коннектится
Код
#define PORT 2042
#define SERVERADDR "mrim.mail.ru"
#define SERVERADDR "mrim.mail.ru"
Функцией WSAStartup() подготавливаю для работы winsock2
Создаю сокет,
Код
my_sock=socket(AF_INET,SOCK_STREAM,0);
заполняю структуру sockaddr_in
Код
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
HOSTENT *hst;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
HOSTENT *hst;
далее преобразуем адрес
Код
hst=gethostbyname ( SERVERADDR );
( ( unsigned long * ) &dest_addr.sin_addr ) [ 0 ] =( ( unsigned long ** ) hst->h_addr_list ) [ 0 ] [ 0 ];
( ( unsigned long * ) &dest_addr.sin_addr ) [ 0 ] =( ( unsigned long ** ) hst->h_addr_list ) [ 0 ] [ 0 ];
сам коннект
Код
connect(my_sock,(sockaddr*) &dest_addr,sizeof(dest_addr));
Вот отсюда и начинаются все непонятки,что делать,как отсылать и принимать.
вот описание протокола
http://agent.mail.ru/protocol.html
Все проблемы начались с непонятного инклюда,в файле,который выложен в описании протокола,
Код
#include
и все,а что собственно нужно подключать??,не сказано=(
ну я удалил эту строчку за ненадобностью
идем далее,сказано,в том же описании,что
"После установки tcp-соединения клиент обязан сразу послать MRIM_CS_HELLO"
Вот и главная проблема.Как отправлять,прнимать,и вообще как их создавать,эти пакеты?
Код
Заголовок пакета
{
u_long magic; // Magic
u_long proto; // Версия протокола
u_long seq; // Sequence
u_long msg; // Тип пакета
u_long dlen; // Длина данных
u_long from; // Адрес отправителя
u_long fromport; // Порт отправителя
u_char reserved[16]; // Зарезервировано
}
{
u_long magic; // Magic
u_long proto; // Версия протокола
u_long seq; // Sequence
u_long msg; // Тип пакета
u_long dlen; // Длина данных
u_long from; // Адрес отправителя
u_long fromport; // Порт отправителя
u_char reserved[16]; // Зарезервировано
}
По порядку,
magic,это мне понятно
в файле proto.h есть константа
Код
#define CS_MAGIC 0xDEADBEEF
версия протокола,тоже понятно откуда брать
Код
#define PROTO_VERSION_MAJOR 1
#define PROTO_VERSION_MINOR 7
#define PROTO_VERSION ((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR))
#define PROTO_VERSION_MINOR 7
#define PROTO_VERSION ((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR))
Sequence,а вот что это такое,я так и не понял.
тип пакета,как я понял,тут и надо указывать MRIM_CS_HELLO
Адрес и порт отправителя,тут что указывать?
Ладно,допустим я разобрался что и где писать,
а как называть пакет?
из файла
Код
typedef struct mrim_packet_header_t
{
u_long magic; // Magic
u_long proto; // Версия протокола
u_long seq; // Sequence
u_long msg; // Тип пакета
u_long dlen; // Длина данных
u_long from; // Адрес отправителя
u_long fromport; // Порт отправителя
u_char reserved[16]; // Зарезервировано
}
mrim_packet_header_t;
{
u_long magic; // Magic
u_long proto; // Версия протокола
u_long seq; // Sequence
u_long msg; // Тип пакета
u_long dlen; // Длина данных
u_long from; // Адрес отправителя
u_long fromport; // Порт отправителя
u_char reserved[16]; // Зарезервировано
}
mrim_packet_header_t;
вот тут я окончательно запутался.
mrim_packet_header_t это тип структуры,и имя пакета одновременно?
Код
int send(SOCKET s,char* buf,int len,int flags);
компилятор ругается,при попытке отправить пакет,
приводить его к типу char* и отправлять?или как быть?
та же история и при приеме данных.
Ну вот,все сказал вроде,что непонятно.
Если вы дочитали до конца весь этот бред,и не поленились посмотреть описание
протокола,огромнейшая просьба,хоть как-то помочь
