Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с исходником 
V
    Опции темы
bamper2
Дата 14.4.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



Программа представляет собой клиентской приложени echo под UDP.
Вопрост такой: когда запускаю экзешник и ввожу ип адрес сервера 127.0.0.1 то возвращается тоже самое эхо которое ввел, хотя при этом программа сервер не работает на компе. Как такое может быть?


#include <winsock2.h>
#include <sys/types.h>
#include <stdio.h>
#include <_str.h>  //для функции strlen
main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);


int s, a=0;

char buf[1024];
char ip[32];
printf("Zdrastvuite\n");
printf("Vvedite adres servera:");
  scanf("%s",&ip);
//gets(ip);
printf("Vvedite slovo:");
//gets(buf);
  scanf("%s",&buf);
s=socket(AF_INET, SOCK_DGRAM, 0);


struct sockaddr_in {
short int          sin_family;
unsigned short int sin_port;
struct in_addr{ unsigned long addr;} sin_addr;
unsigned char      sin_zero[1024];
};

struct sockaddr_in serv;



serv.sin_family=AF_INET;
serv.sin_port=htons(13);
serv.sin_addr.addr=inet_addr(ip);

bind(s, (struct sockaddr *)&serv, sizeof(serv));


//int boom=sizeof (serv);
int fromlen1;


a=sendto(s, buf, strlen (buf), 0, (struct sockaddr*)&serv, sizeof(serv));
 struct sockaddr_in serv_adr;
 int server_adr_size=sizeof (serv_adr);
                                                                                //char buf1[1024];
                                                                                //scanf("%s",&buf1);
fromlen1=recvfrom(s, buf1, sizeof(buf1), 0,(struct sockaddr*)&serv_adr, &server_adr_size );

printf("Port=%d\n",IPPORT_ECHO);
printf("Port=%d\n",htons(IPPORT_ECHO));
printf("IP=%s\n",ip);
printf("IP=%d\n",inet_addr(ip));
printf("Byte otpravleno:=%d\n", a);
printf("Byte polycheno:=%d\n", fromlen1);

printf("ECHO=%s\n",buf1);
scanf("%s",&ip);

closesocket(s);
WSACleanup();
}
PM MAIL   Вверх
sergu
Дата 15.4.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2006

Репутация: нет
Всего: нет



Дружище! Дело в том, что протокол UDP работает без установления соединения. Что это значит? А то, что клиенту нет необходимости вызывать функцию Connect. Он может сразу посылать и принимать  пакеты. В твоем случае - это скорее не клиент, а сервер, который шлет сам себе сообщение  smile Почему сервер? Обрати внимание на строчку bind(s, (struct sockaddr *)&serv, sizeof(serv)); Этой функцией ты ассоциируешь адрес который ты вводишь ( 127.0.0.1) и порт 13 с сокетом s. В принципе, после этой строки твое приложение и стало сервером. Ну а еще, если ты не знаешь, адрес 127.0.0.1 -  адрес твоего же копьютера. 
Т.е. получается, что ты отправляешь  строку  sendto(s, buf, strlen (buf), 0, (struct sockaddr*)&serv, sizeof(serv)); сокету s, котрый на ходится по адресу 127.0.0.1 и на порту 13, а потом принимаешь recvfrom(s, buf1, sizeof(buf1), 0,(struct sockaddr*)&serv_adr, &server_adr_size ); с того же самого сокета.  Т.е. ты отправил себе же сообщение.
В общем советую тебе почитать статью http://www.citforum.ru/book/cook/winsock.shtml Там русским по белому все расписано и прведены примеры udp и tcp клиентов и эхо серверов.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0418 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.