Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WinSock

253
16 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Пытаюсь написать на Delphi простую прогу которая будет слать сообщения(типа net send)
На одном и том же компе она работает а как только по сети - ошибка Remote computer does not found
Если у кого нибудь есть идеи или примеры - киньте сюда pls
10K
21 июля 2005 года
Stepler__
15 / / 19.07.2005
Цитата:
Originally posted by Proger_XP
Пытаюсь написать на Delphi простую прогу которая будет слать сообщения(типа net send)
На одном и том же компе она работает а как только по сети - ошибка Remote computer does not found
Если у кого нибудь есть идеи или примеры - киньте сюда pls




Привет!!! :) Я Писал что-то похожее тока там не только сообщения слал, а еще и управлял компом... Ну там монитор потушить, вырубить комп... Тока я использовал делфийские КлиентСокет, СерверСокет... Все прикрасно работает... Тока если я найду... То могу кинуть исходник...

253
21 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by Stepler__
Привет!!! :) Я Писал что-то похожее тока там не только сообщения слал, а еще и управлял компом... Ну там монитор потушить, вырубить комп... Тока я использовал делфийские КлиентСокет, СерверСокет... Все прикрасно работает... Тока если я найду... То могу кинуть исходник...


Не надо
На VCL я тоже могу это сделать а нужно API

2
04 августа 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by Proger_XP
Пытаюсь написать на Delphi простую прогу которая будет слать сообщения(типа net send)
На одном и том же компе она работает а как только по сети - ошибка Remote computer does not found
Если у кого нибудь есть идеи или примеры - киньте сюда pls



не работающий код приведи пожалуйста - клиента и сервера. только в тэги оформи. разберем пошагово. 99% - пытаешься использовать NetBIOS имя вместо FQDN/IP адреса

253
04 августа 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by squirL
не работающий код приведи пожалуйста - клиента и сервера. только в тэги оформи. разберем пошагово. 99% - пытаешься использовать NetBIOS имя вместо FQDN/IP адреса


Пример гибрид MSDN и мой ))
Клиент:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  szclienta: string[100];
  szclientw: string[100];
  serversock: tsocket;
  destination_sin: tsockaddrin;
  wsa: wsadata;
begin

{              HINSTANCE hInstance,    // Handle to the current instance
              HINSTANCE hPrevInstance,// Handle to the previous instance
              LPTSTR lpCmdLine,       // Pointer to the command line
              int nCmdShow)           // Show state of the window}

  // Initialize Winsocket.
  if (WSAStartup (MAKEWORD(1,1), wsa) <> 0) then
    halt;
  {
    wsprintf (szError, TEXT("WSAStartup failed. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    return FALSE;
  }

  // Create a TCP/IP socket that is bound to the server.
  ServerSock := socket (AF_INET, SOCK_STREAM, 0);
  if (serversock = INVALID_SOCKET) then
    halt;
  {
    wsprintf (szError, TEXT("Allocating socket failed. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    return FALSE;
  }

  // Fill out the server socket's address information.
  fillchar(destination_sin, sizeof(destination_sin), 0);
  destination_sin.sin_family := AF_INET;
       
  // Retrieve the host information corresponding to the host name.
  phe := gethostbyname ('GUEST'); ireturn := wsagetlasterror;
  if (phe = NIL) then
    halt;
  {
    wsprintf (szError, TEXT("Unable to get the host name. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    closesocket (ServerSock);
    return FALSE;
  }

  // Assign the socket IP address
{  asm
  mov cx, 0
  @@l1: mov al, byte ptr [cl + phe + 16]
  mov byte ptr [destination_sin + 4], al
  inc cx
  cmp cx, word ptr [phe + 10]
  jle @@l1
  end}
  destination_sin.sin_addr := pinaddr(phe.h_addr^)^;
  // Convert to network ordering
  destination_sin.sin_port := htons (PORTNUM);
  caption := '3';
  // Establish a connection to the server socket
  if (connect (ServerSock,
               destination_sin,
               sizeof (destination_sin)) = SOCKET_ERROR) then
//               ireturn := wsagetlasterror
               halt;
  {
    wsprintf (szError,
              TEXT("Connecting to the server failed. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    closesocket (ServerSock);
    return FALSE;
  }

  // Send a string to the server.
  szclienta := 'to server';
  caption := '4';
  if (send (ServerSock, szclienta, length(szclienta), 0)
           = SOCKET_ERROR) then
           halt;
  {
    wsprintf (szError,
              TEXT("Sending data to the server failed. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
  }

  // Disable sending on ServerSock.
  shutdown (ServerSock, 1);
  beep;
  caption := 'sent';
  exit;
  while true do
  begin
    // Receive data from the server socket.
    iReturn := recv (ServerSock, szClientA, sizeof (szClientA), 0);

    // Check if there is any data received. If there is, display it
    if (iReturn = SOCKET_ERROR) then
      halt
    {
      wsprintf (szError, TEXT("No data is received, recv failed.")
                TEXT(" Error: %d"), WSAGetLastError ());
      MessageBox (NULL, szError, TEXT("Client"), MB_OK);
      break;
    }
    else if (iReturn = 0) then
    begin
      caption := '6';
      windows.beep(100, 100);
      break
    end
    {
      MessageBox (NULL, TEXT("Finished receiving data"), TEXT("Client"),
                  MB_OK);
      break;
    }
    else
    begin
      // Convert the ASCII string to a Unicode string.
{      for (index = 0; index <= sizeof (szClientA); index++)
        szClientW[index] = szClientA[index]}
      // Display the string received from the server.
      MessageBox (0, @szClientW, 'Received From Server', MB_OK)
    end
  end;
  // Disable receiving on ServerSock
  shutdown (ServerSock, 0);

  // Close the socket
  closesocket (ServerSock);

  WSACleanup ()
end;

Сервер:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  sock: tsocket;
  wsa: twsadata;
  sia: tsockaddrin;
  he: phostent;
  ca: tsockaddr;
  cas: integer;
  buf: string[100];
begin
  wsastartup(makeword(1, 1), wsa);
  sock := socket(af_inet, sock_stream, 0);
  if sock = 0 then
    halt;
  fillchar(sia, sizeof(sia), 0);
  he := gethostbyname ('GUEST');
  sia.sin_family := af_inet;
  if (he = NIL) then
    halt;
  sia.sin_addr := pinaddr(he.h_addr^)^;
  sia.sin_port := htons (PORTNUM);
  if bind(sock, sia, sizeof(sia)) <> 0 then
  begin
    caption := inttostr(wsagetlasterror);
    sleep(1000);
    halt
  end;
  caption := '1';
  if listen(sock, 1) <> 0 then
    halt;
  caption := 'accepting';
  cas := sizeof(ca);
  ireturn := accept(sock, @ca, @cas);
  if ireturn = -1 then
    halt;
  sock := ireturn;
  if recv(sock, buf, sizeof(buf), 0) = -1 then
//    ireturn := wsagetlasterror
    halt;
  showmessage(buf);
  caption := '2'
end;

З.Ы: привожу со всем Сишным "мусором" поэтому проэкт должен быть читабельнее ))
406
05 августа 2005 года
vitaly2003s
481 / / 27.07.2004
Мне кажется у тебя ошибка возникает в клиентской части кода:
phe := gethostbyname ('GUEST'); ireturn := wsagetlasterror;
if (phe = NIL) then
halt;
{
wsprintf (szError, TEXT("Unable to get the host name. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}

// Assign the socket IP address
{ asm
mov cx, 0
@@l1: mov al, byte ptr [cl + phe + 16]
mov byte ptr [destination_sin + 4], al
inc cx
cmp cx, word ptr [phe + 10]
jle @@l1
end}
destination_sin.sin_addr := pinaddr(phe.h_addr^)^;
// Convert to network ordering
destination_sin.sin_port := htons (PORTNUM);
caption := '3';
// Establish a connection to the server socket
if (connect (ServerSock,
destination_sin,
sizeof (destination_sin))

Что ты здесь пытаешся сделать?
Во первых ты пытаешся назначить адрес сервака полученного при помощи gethostbyname ('GUEST'),но удаленный хост не будет иметь это имя,и вообще лучше не gethostbyname ('GUEST') а gethostbyname ('localhost') для сервака. В клиенте же если удаленный сервак не имеет днс имени,то установить с ним соединение ты сможеш только если точно укажеш ip адрес сервака.

Поэтому у тебя это и работала на одном компе когда клиент и сервер получали однин и тот же локальный адресс твоего компа,а когда твои клиент и сервер нахродятся на разных компах и при этом клиент пытается присоединится к локальному адресу хотя сервер висит уже на другом компе у которого совершенно другой адресс,то сам понимае ничего не выйдет.
253
05 августа 2005 года
Proger_XP
1.5K / / 07.08.2004
Ясно
Если не трудно, приведи полный работающий код pls
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог