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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 08.09.2015, 22:08   #1
alman12
Форумчанин
 
Регистрация: 30.12.2013
Сообщений: 466
По умолчанию [РЕШЕНО]: отправка сообшения по локалной сети. Ошибка PChar

как отправит сообшения по локалной сети ? Я нашел такой код но почему выдает ошибку при компляции в PChar
Код:
var
  ChatForm: TChatForm;

  function GetErrorString: string;

implementation
{$R *.DFM}

function GetErrorString: string;
var
  Buffer: array[0..2047] of Char;
begin
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, WSAGetLastError, $400,
    @Buffer, SizeOf(Buffer), nil);
  Result := Buffer;
end;

procedure TChatForm.AddMessageToLog(const aMsg: string);
begin
  MemoMessages.Lines.Add(aMsg);
  MemoMessages.SelStart := Length(MemoMessages.Text);
end;

procedure TChatForm.OnStopServer;
begin
  LabelServerPort.Enabled := True;
  EditServerPort.Enabled := True;
  BtnStartServer.Enabled := True;
  LabelServerState.Caption := 'Сервер не работает';
end;

procedure TChatForm.FormCreate(Sender: TObject);
var
  WSAData : TWSAData;
  Addr  : TSockAddr; 
  AddrLen : Integer;
begin
  if WSAStartup($101, WSAData) <> 0 then
  begin
    MessageDlg('Ошибка при инициализации библиотеки WinSock', mtError, [mbOK], 0);
    Application.Terminate;
  end;
  OnStopServer;
  fSendSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if fSendSocket = INVALID_SOCKET then
  begin
    MessageDlg('Ошибка при создании отправляющего сокета:'#13#10 + GetErrorString, mtError, [mbOK], 0);
    Exit;
  end;

  FillChar(Addr.sin_zero, SizeOf(Addr.sin_zero), 0);
  Addr.sin_family := AF_INET;
  Addr.sin_addr.S_addr := INADDR_ANY;
  Addr.sin_port := 0;
  if bind(fSendSocket, Addr, SizeOf(Addr)) = SOCKET_ERROR then
  begin
    MessageDlg('Ошибка при привязке отправляющего сокета к адресу:'#13#10 + GetErrorString, mtError, [mbOK], 0);
    Exit;
  end;

  AddrLen := SizeOf(Addr);
  if getsockname(fSendSocket, Addr, AddrLen) = SOCKET_ERROR then
  begin
    MessageDlg('Ошибка при получении адреса отправляющего сокета:'#13#10 + GetErrorString, mtError, [mbOK], 0);
    Exit;
  end;
  LabelSendPort.Caption := 'Порт отправки: ' + IntToStr(ntohs(Addr.sin_port));
end;

procedure TChatForm.BtnStartServerClick(Sender: TObject);
var
  ServerSocket  : TSocket; 
  ServerAddr  : TSockAddr;
begin

  FillChar(ServerAddr.sin_zero, SizeOf(ServerAddr.sin_zero), 0);
  ServerAddr.sin_family := AF_INET;
  ServerAddr.sin_addr.S_addr := INADDR_ANY;
  ServerAddr.sin_port := htons(StrToInt(EditServerPort.Text));
  if ServerAddr.sin_port = 0 then
  begin
    MessageDlg('Номер порта должен лежать в диапазоне 1-65535', mtError, [mbOK], 0);
    Exit;
  end;
  ServerSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if ServerSocket = INVALID_SOCKET then
  begin
    MessageDlg('Ошибка при создании сокета:'#13#10 + GetErrorString, mtError, [mbOK], 0);
    Exit;
  end;
  if bind(ServerSocket, ServerAddr, SizeOf(ServerAddr)) = SOCKET_ERROR then
  begin
    MessageDlg('Ошибка при привязке сокета к адресу:'#13#10 + GetErrorString, mtError, [mbOK], 0);
    closesocket(ServerSocket);
    Exit;
  end;
  TReceiveThread.Create(ServerSocket);
  LabelServerPort.Enabled := False;
  EditServerPort.Enabled := False;
  BtnStartServer.Enabled := False;
  LabelServerState.Caption := 'Сервер работает';
end;

procedure TChatForm.BtnSendClick(Sender: TObject);
var
  SendAddr: TSockAddr;  // Адрес назначения
  Msg     : string;     // Сообщение для отправки
  SendRes : Integer;    // Результат отправки
begin
  FillChar(SendAddr.sin_zero, SizeOf(SendAddr.sin_zero), 0);
  SendAddr.sin_family := AF_INET;
  SendAddr.sin_addr.S_addr := inet_addr(PChar(EditSendAddr.Text));
  if SendAddr.sin_addr.S_addr = INADDR_NONE then
  begin
    MessageDlg('"' +EditSendAddr.Text + '" не является IP-адресом', mtError, [mbOK], 0);
    Exit;
  end;
  SendAddr.sin_port := htons(StrToInt(EditSendPort.Text));
  Msg := EditMessage.Text;
  if Length(Msg) = 0 then
    SendRes := sendto(fSendSocket, Msg, 0, 0, SendAddr, SizeOf(SendAddr))
  else // Отправляем сообщение, содержащее строку
    SendRes := sendto(fSendSocket, Msg[1], Length(Msg), 0, SendAddr, SizeOf(SendAddr));
  if SendRes < 0 then
    MessageDlg('Ошибка при отправке сообщения:'#13#10 + GetErrorString, mtError, [mbOK], 0)
  else
    AddMessageToLog('Для ' + EditSendAddr.Text + ':' + EditSendPort.Text +
      ' отправлено сообщение: ' + Msg);
end;

end.
Решение:
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да стандартную про PAnsiChar и PChar.
надо так
Код:
PAnsiChar(AnsiString(EditSendAddr.Text))
тока ТС. такие проблемы давно пора самому решать.
это ж основы языка. прекращайте копипастом страдать.

Последний раз редактировалось Вадим Мошев; 15.05.2018 в 20:22.
alman12 вне форума
Старый 09.09.2015, 07:45   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Какую ошибку? На какой строчке?
FaTaL вне форума
Старый 09.09.2015, 10:25   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да стандартную про PAnsiChar и PChar.
надо так
Код:
PAnsiChar(AnsiString(EditSendAddr.Text))
тока ТС. такие проблемы давно пора самому решать.
это ж основы языка. прекращайте копипастом страдать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 09.09.2015, 20:25   #4
alman12
Форумчанин
 
Регистрация: 30.12.2013
Сообщений: 466
Хорошо

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да стандартную про PAnsiChar и PChar.
надо так
Код:
PAnsiChar(AnsiString(EditSendAddr.Text))
тока ТС. такие проблемы давно пора самому решать.
это ж основы языка. прекращайте копипастом страдать.
спасиба ..............................
alman12 вне форума
Закрытая тема


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка файлов по локальной сети dani92 Работа с сетью в Delphi 5 08.06.2021 20:31
Проблемы с выводом сообшения чекбоксов youngcoder PHP 2 03.12.2012 04:58
Отправка массива по сети xpams Помощь студентам 1 02.12.2011 21:27
Отправка файла по сети.Как? Denutrror Работа с сетью в Delphi 1 09.07.2011 19:43
посылка сообшения на маил Assemblerru Общие вопросы C/C++ 0 06.05.2010 19:51