Avatar billede sprox Nybegynder
14. december 2002 - 14:07 Der er 13 kommentarer og
2 løsninger

2 sikkert nemme ting for jer hajer :]

Hej

Jeg har lige 2 spørgsmål, 75 points for hver.

1. Hvordan lukker jeg et andet program fra mit c++ program?

2. Sockets, jeg har leget lidt med sockets hist og her men når jeg vil modtage data fra en server.. hvordan checker jeg så om der er kommet noget?
Jeg kan godt bruge recv, men man kan vel ik bare sætte en løkke igang med blabla = recv(osv.osv.)
eller?

på forhånd tak
Michael
Avatar billede arne_v Ekspert
14. december 2002 - 14:12 #1
1)  Er platform specifikt. Kører du Windows, Linux, IBM mainframe
    eller ?

2)  Sockets kan være i 2 modes: blocking og non-blocking. Når
    du er i blocking mode, så venter dit recv kald indtil
    der er nogle data. Når du er i non-blocking mode, så
    returnerer recv med det samme, hvis der ikke er nogle
    data.
Avatar billede sprox Nybegynder
14. december 2002 - 14:14 #2
1: windows :)

2. gider du ikke lave et eksempel :)
bare sig hvis der ska flere points til
Avatar billede sprox Nybegynder
14. december 2002 - 14:14 #3
jeg forstår ik helt det med blocking :|
Avatar billede arne_v Ekspert
14. december 2002 - 14:30 #4
re 1)  Muligvis virker det almindelige kill kald også
      på Windows, men du vil jo sikkert også gerne vide,
      hvordan du finder pid og det kan jeg ikke klare
      på windows.
Avatar billede sprox Nybegynder
14. december 2002 - 14:31 #5
oki :)
Avatar billede arne_v Ekspert
14. december 2002 - 14:32 #6
re 2)

Blocking : du kalder recv, hvis der er data så returnerer den
med de data med det samme, hvis der ikke er data så venter kaldet
indtil der er data og returnerer dem

Non-blocking: du kalder recv, hvsi der er data så returnerer den
med de data med det samme, hvis der ikke er data så returnerer
kaldet øjeblikkeligt uden data.

Det er en option man kan sætte på socket'en.
Avatar billede sprox Nybegynder
14. december 2002 - 14:33 #7
int bytes_read;
bytes_read = recv(sock,buf,sizeof(buf),0);

det er hvad jeg bruger :)
Avatar billede sprox Nybegynder
14. december 2002 - 14:34 #8
noget kode helst :)
(ved godt jeg er krævende :|)
Avatar billede arne_v Ekspert
14. december 2002 - 15:40 #9
Som sagt er jeg ikke nogen ørn til Windows
programmering.

Lidt browsen på nettet antydede, at Windows
default er non-blocking.

Hvis det er tilfældet kan du bare kalde recv.

Hvis ikke skal du ændret det (se funktion ioctlsocket).
Avatar billede sprox Nybegynder
14. december 2002 - 15:52 #10
Okay, prøver, men jeg venter lige med at acceptere :)
Avatar billede jpk Nybegynder
16. december 2002 - 08:56 #11
Hvordan ønsker du at finde det program du vil lukke ned, via navnet?
Avatar billede sprox Nybegynder
16. december 2002 - 18:35 #12
ja
Avatar billede hsloth Novice
18. december 2002 - 21:28 #13
Nedenstående kan bruges til at slå alle processer med et bestgemt navn ihjel :

void Kill( char *theName )
{
  // Get the list of process identifiers.

  DWORD aProcesses[1024], cbNeeded, cProcesses;
  unsigned int i;

  if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return ;

  // Calculate how many process identifiers were returned.
  cProcesses = cbNeeded / sizeof(DWORD);

  for ( i = 0; i < cProcesses; i++ )
  {
      if( stricmp(theName, GetProcessName(aProcesses[i]).c_str()) == 0)
      {
    KillById(aProcesses[i]);
      }
  }
}


void KillById( DWORD theProcId)
{
  HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                PROCESS_TERMINATE |
                PROCESS_VM_READ,
                FALSE, theProcId);
  ::CloseHandle(hProcess);
}
Avatar billede hsloth Novice
18. december 2002 - 21:30 #14
Jeg manglede vist en funktion:

std::string GetProcessName( DWORD processID )
{
  char szProcessName[MAX_PATH] = "unknown";


- Eksempel på brug :
Kill("CL.EXE");

Ovenstående slår microsoft's c-compiler ihjel
  // Get a handle to the process.

  HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                  PROCESS_VM_READ,
                                  FALSE, processID );

    // Get the process name.
    if ( hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
            &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName,
                              sizeof(szProcessName) );
        }
    }

  CloseHandle( hProcess );
  return szProcessName;
}
Avatar billede theprofessor Nybegynder
19. december 2002 - 16:51 #15
har du brugt exit() funktionen??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester