Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Слушай, дружище, зачем так мучиться с этим языком С++, ты ведь не Билл Гейтс. Возьми тот же Python и программируй, он кроссплатформенный, под Windows тоже работает. Я сам давно заметил: то что на Си пишешь в страницу кода, на питоне решается в одну-две строки. При том, питон намного проще, я его сам недавно изучил по видеокурсу вот этому. Кстати, автор отлично там объясняет. Буквально день-два и уже будешь писать на нём, чего не скажешь про сложный С++.

Есть такой протокол -- UDP

С этим протоколом обычно через сокеты работают :)

различия следующие:
создать сокет для UDP:
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

создать сокет для TCP:
socket(PF_INET, SOCK_STREAM, 0);

первый и третий параметры могут варьироваться, но второй параметр должен соответствовать именно тому, что я привёл.

второе главное отличие TCP от UDP состоит в том, что TCP перед началом передачи данных необходимо установить канал связи, для этого он использует такие функции как listen (для ожидающего сервера) и connect (для клиента), а обмен данными осуществяется функциями send и recv. В то время как UDP для передачи данных не требует создания канала связи и поэтому после создания UDP сокета можно сразу приступать к передаче данных функциями recvfrom и sendto.

Привязка сокета к определённому порту в обоих случаях осуществляется функцией bind.
Всё хорошо, но как пользовать bind?
Я объявляю SOCKADDR_IN, и юзаю bind как для TCP. Это правильно?
А как послать UDP на конкретный порт? sendto просит структуру SOCKADDR в которой вообще порт не указывается. Если я пытаюсь подсунуть SOCKADDR_IN компилятор ругается. В MSDN вообще написано что тип структуры SOCKADDR строго не регламентирован и для разных протоколов может быть разным. Например для TCP -- SOCKADDR_IN.
Как правильно юзать сабж
int lenret;
struct sockaddr_in s_address;
if(sock_out != INVALID_SOCKET) {
memset(&s_address,0,sizeof(SOCKADDR_IN));
s_address.sin_family = AF_INET;
s_address.sin_addr.s_addr = inet_addr(szAddr);
s_address.sin_port = htons((WORD)nPort);
}

lenret=sendto(sock_out,(char *)buf,nDataLen+sizeof(UDPHDR),0,(SOCKADDR *)&(s_address),sizeof(SOCKADDR_IN));
free(buf);


при этом сокет создаётся следующим образом:

BOOL CreateOutgoingSocket(void)
{
struct sockaddr_in srv_address;
int namelen;

sock_out = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sock_out != INVALID_SOCKET) {
memset(&srv_address,0,sizeof(SOCKADDR_IN));
srv_address.sin_addr.S_un.S_addr=INADDR_ANY;
srv_address.sin_family = AF_INET;
srv_address.sin_port = 0;
}
if(bind(sock_out, (SOCKADDR *) &srv_address, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
closesocket(sock_out);
return FALSE;
} else {
namelen=sizeof(SOCKADDR_IN);
getsockname(sock_out,(SOCKADDR *)&srv_address,&namelen);
return TRUE;
}
}


тобишь строчка:
srv_address.sin_port = 0;
означает, чтосистема присобачит сокет на первый же попавшийся свободный порт.

а строчки:
s_address.sin_addr.s_addr = inet_addr(szAddr);
s_address.sin_port = htons((WORD)nPort);
указывают адрес и порт, на который будет отправлен пакет.

переменные объявлены как
int nPort;
const char *szAddr;


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS