Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2013, 14:36   #1
Canabalt
Пользователь
 
Регистрация: 04.01.2013
Сообщений: 11
По умолчанию windows socket на c++ builder

Никак не могу разобраться с виндовс сокетами. Нужно с их помощу передать с клиента на сервер сообщения из едита. При нажатии на кнопку отправить ничего не происходит, как на сервере та и на клиенте

Код клиента
Код:
#define IP "127.0.0.1"
#define PORT 2020

AnsiString buff = "1234";

//Старт
WSADATA *wsaData=new WSADATA;
if (WSAStartup(0x202,wsaData))
{ Form1->Memo1->Lines->Add("Start Error");
}
else {Form1->Memo1->Lines->Add("Start OK");}

//Создание сокета
SOCKET sok;
sok = socket(AF_INET, SOCK_DGRAM,0);
if(sok==INVALID_SOCKET) {Form1->Memo1->Lines->Add("Ошибка создания сокета");}
else {Form1->Memo1->Lines->Add("Сокет успешно создан");} 

//Обмен данными
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
dest_addr.sin_addr.s_addr=inet_addr(IP);

int sendto((sok, buff.c_str(),buff.Length(),0,(sockaddr *)&dest_addr,sizeof(dest_addr)));

Form1->Memo2->Lines->Add(buff);
Form1->Memo2->Lines->Add(IntToStr(sendto)) ;

//Зактытие сокета
if(Terminated){
if (WSACleanup()) { Form1->Memo1->Lines->Add("Close error");}
else { Form1->Memo1->Lines->Add("Clearnup OK ");
delete wsaData; }
}
=================================== ====================
Сервер
Код:
#define PORT 2020

AnsiString buff;

//Start Socket

WSADATA wsaData;

if (WSAStartup(0x202,&wsaData)!=0)
{
Form1->Memo1->Lines->Add("Error Start");
}
else
{ Form1->Memo1->Lines->Add("Start OK");}

// Create Socket
SOCKET s;
s=socket(AF_INET, SOCK_DGRAM,0);
if (s==INVALID_SOCKET)
{
Form1->Memo1->Lines->Add("Error Create Socket");
}
else
{
Form1->Memo1->Lines->Add("Socket Create");
}

//Заполнение структуры

struct sockaddr_in serv_addr;
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr.s_addr=INADDR_ANY;

//BINDing

int err=bind(s,(sockaddr*)&serv_addr,sizeof(serv_addr));
if (err==0)
{
Form1->Memo1->Lines->Add("Bind OK");
}
else
{
Form1->Memo1->Lines->Add("Bind Error");
}
// сокет для клиента

SOCKET client_sock; 
sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);

client_sock=accept(s, (sockaddr *)&client_addr, &client_addr_size);
Form1->Memo1->Lines->Add("Accept OK");

while(1)
{

Sleep(100);

int bsize= recvfrom(s,buff.c_str(),buff.Length(),0,(sockaddr *)&client_addr, &client_addr_size);
Form1->Memo2->Lines->Add(buff);

if (bsize==SOCKET_ERROR)
{
Form1->Memo1->Lines->Add("RecvFrom Error");
}
}

Последний раз редактировалось Stilet; 05.01.2013 в 15:14.
Canabalt вне форума Ответить с цитированием
Старый 04.01.2013, 22:26   #2
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

У вас плохо со знаниями протоколов... Сервер ничего не отправляет... это лишь способ связи с несколькими клиентами.. быть может для ваше проблемы достаточно будет клиент-клиент протокола?

Здесь <-- вы получите более подробную инфу...
да литература и документации на русском лучше не читать.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Stilet; 05.01.2013 в 15:17.
Perchik71 вне форума Ответить с цитированием
Старый 05.01.2013, 01:20   #3
Canabalt
Пользователь
 
Регистрация: 04.01.2013
Сообщений: 11
По умолчанию

Так сервер и не должен ничего отправлять клиенту. На него должны приходить сообщения по юдп. И вообще с сокетами у меня проблема. Я не могу понять как с ними работать. Примера найти не могу. Все что нашел , какое то сложное и заумное.

Последний раз редактировалось Canabalt; 05.01.2013 в 01:23.
Canabalt вне форума Ответить с цитированием
Старый 05.01.2013, 14:57   #4
Canabalt
Пользователь
 
Регистрация: 04.01.2013
Сообщений: 11
По умолчанию

Может кто то дать пример работы с виндовс сокетами.
Мне нужно каждые 50 млсек передавать на сервер числа, по ЮДП протоколу.
А я никак не могу разобраться что к чему. Синхронные, асинхронные сокеты. Все как то сложно и заумно написано.
Canabalt вне форума Ответить с цитированием
Старый 05.01.2013, 20:36   #5
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Анси и обычное..
Анси - мнима главного потока... не тормозить приложение.
обычная... тормозить так... что качалку не сделаешь.!
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 05.01.2013, 20:38   #6
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

В билде давно уже есть компоненты в которых всё настроено. TUCPClient/Server или инди.
//----
ПС: устал... и вместо правки уже новый пост... пойду я дымить и спать. -__-
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 08.01.2013, 13:30   #7
Canabalt
Пользователь
 
Регистрация: 04.01.2013
Сообщений: 11
По умолчанию

Ну с отправкой я уже разобрался.
Теперь такой вопрос. На клиенте я генерирую шесть чисел по два байта. Потом пакет 12 байт нужно переслать на сервер. Так вот вопрос, при отправке через сокеты, будет генерироваться и отравлятся пакет автоматически, или нужно как то самому создавать пакет на отправку.
Canabalt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows7 - "Windows socket error: Требуемый адрес для своего контекста неверен (10049), on API 'connect' BaiAs БД в Delphi 4 06.09.2017 10:12
socket в builder accord_999 C++ Builder 2 03.04.2010 21:31
Программка для Windows в системе Builder!!!))) Sudeki Помощь студентам 0 13.12.2009 16:32