WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Есть такой прОтокол -- UDP....

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Есть такой прОтокол -- UDP....
server_mouse опубликован 09-08-2001 20:33 MSK   Click Here to See the Profile for server_mouse   Click Here to Email server_mouse  
Народ, кто-нить знает как с сабжем работать.
Можно ли через сокеты?
Emerald опубликован 09-08-2001 21:05 MSK     Click Here to See the Profile for Emerald  Click Here to Email Emerald     
Кинь мне свой Е-Mail на diam@softhome.net -- я тебе всё подробно опишу. Щас времени в Инете нет писать.
purpe опубликован 10-08-2001 09:34 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
так с этим протоколом обычно через сокеты и работают :)

различия следующие:
создать сокет для 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.

server_mouse опубликован 13-08-2001 12:51 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Всё хорошо, но как пользовать bind?
Я объявляю SOCKADDR_IN, и юзаю bind как для TCP. Это правильно?
А как послать UDP на конкретный порт? sendto просит структуру SOCKADDR в которой вообще порт не указывается. Если я пытаюсь подсунуть SOCKADDR_IN компилятор ругается. В MSDN вообще написано что тип структуры SOCKADDR строго не регламентирован и для разных протоколов может быть разным. Например для TCP -- SOCKADDR_IN.
Как правильно юзать сабж?
purpe опубликован 13-08-2001 13:33 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
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;

server_mouse опубликован 13-08-2001 18:03 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Спасибо, всё заработало!

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.