Avatar billede Slettet bruger
26. april 2006 - 22:30 Der er 11 kommentarer og
2 løsninger

TCP Server spørgsmål

Hejsa alle sammen:

Jeg har følgende meget simple TCP server.. den virker og kan connecte. Men hvordan får jeg den til at "opdage" at client disconnecter, og så sætter sig til at lytte igen (kører Connect())

http://www.nomorepasting.com/paste.php?pasteID=61468

Mange tak
Avatar billede coderdk Praktikant
26. april 2006 - 22:56 #1
Måske ved at ændre:

Connect();

while(_getch()!=27); //27 is ESC char

til:

while(_getch()!=27)
  Connect(); //27 is ESC char
Avatar billede Slettet bruger
26. april 2006 - 22:59 #2
så connecter den jo kun igen hvis jeg trykker ESC?.. den skal jo gøre det når client disconnecter
Avatar billede coderdk Praktikant
26. april 2006 - 23:03 #3
Mnææh den er jo i et loop?
Avatar billede Slettet bruger
26. april 2006 - 23:07 #4
while(_getch()!=27) kommer den jo først forbi når jeg vil lukke konsollen..
Avatar billede arne_v Ekspert
27. april 2006 - 00:43 #5
du får en timeout på både recv og send hvis client forsvinder

men for at få en fornuftig process skal du nok starte en tråd per client
således at du er klar til at lytte efter nye connections med det samme
Avatar billede arne_v Ekspert
27. april 2006 - 00:45 #6
jeg lavede det her eksempel i marts for at illustere teknikken (det er ikke
production ready kode, men du bør kunne få nogle ideer):

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

#include <windows.h>

const char *WELCOME="Welcome\r\n";
const char *QUIT="quit\r\n";
const char *BYEBYE="Bye bye\r\n";
const char *UNKNOWN="Unknown command\r\n";
const char *NEWLINE="\r\n";

DWORD __stdcall client(void *p)
{
    int sd2=*((int*)p);
    send(sd2,WELCOME,strlen(WELCOME),0);
    char buf[80];
    memset(buf,0x00,sizeof(buf));
    int ix=0;
    int len;
    while((len=recv(sd2,buf+ix,sizeof(buf)-ix,0))>0)
    {
        ix=ix+len;
        if(strstr(buf,NEWLINE)!=NULL)
        {
            char cmd[80];
            memset(cmd,0x00,sizeof(cmd));
            int cmdlen = (strstr(buf,NEWLINE)-buf)+strlen(NEWLINE);
            memmove(cmd,buf,cmdlen);
            memmove(buf,buf+cmdlen,ix-cmdlen);
            ix=ix-cmdlen;
            memset(buf+ix,0x00,sizeof(buf)-ix);
            if(strcmpi(cmd,QUIT)==0)
            {
                send(sd2,BYEBYE,strlen(BYEBYE),0);
                closesocket(sd2);
                cout << "Client disconnected" << endl;
                break;
            }
            else
            {
                send(sd2,UNKNOWN,strlen(UNKNOWN),0);
            }
        }
    }
    return 0;
}

const int MAXCLI=10;

int main()
{
    WSADATA WSAData;
    WSAStartup(0x0101,&WSAData);
    int sd=socket(AF_INET,SOCK_STREAM,0);
    if(sd<0)
    {
        cout << "Could not create socket: " << strerror(errno) << endl;
    }
    int status;
    struct sockaddr_in local;
    local.sin_family=AF_INET;
    local.sin_port = htons(1234);
    local.sin_addr.s_addr = INADDR_ANY;
    status=bind(sd,(struct sockaddr *)&local,sizeof(local));
    if(status<0)
    {
        cout << "Could not bind socket: " << strerror(errno) << endl;
    }
    status=listen(sd,5);
    if(status<0)
    {
        cout << "Could not listen to socket: " << strerror(errno) << endl;
    }
    int sd2[MAXCLI];
    int n=0;
    while(1)
    {
        sd2[n]=accept(sd,0,0);
        if(sd2[n]<0)
        {
            cout << "Could not accept socket: " << strerror(errno) << endl;
        }
        cout << "Client connected" << endl;
        DWORD id;
        CreateThread(0, 0, client, (LPVOID)&sd2[n], 0, &id);
        n=(n+1)%MAXCLI;
    }
    closesocket(sd);
    WSACleanup();
    return 0;
}
Avatar billede arne_v Ekspert
19. juni 2006 - 01:22 #7
wb ??
Avatar billede Slettet bruger
19. juni 2006 - 23:42 #8
jep, undskyld, mange tak! :)
Avatar billede arne_v Ekspert
20. juni 2006 - 01:15 #9
Nogen der skal ligge et svar eller ?
Avatar billede Slettet bruger
20. juni 2006 - 15:03 #10
hvad mener du?
Avatar billede arne_v Ekspert
20. juni 2006 - 18:39 #11
jeg spoerger om du vil give mig eller coderdk point eller du tager dem selv
Avatar billede Slettet bruger
20. juni 2006 - 20:09 #12
jeg har da lagt et svar, lægger et igen så
Avatar billede coderdk Praktikant
20. juni 2006 - 20:36 #13
Jeg tror arne mente om en af os, som jeg går ud fra skal have point, skulle lægge et.
Anyway ;) Jeg skal ingen have, ellers tak.
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