Avatar billede mad_man Nybegynder
25. juli 2003 - 11:18 Der er 14 kommentarer og
1 løsning

2 loops

hej hej experter =)
jeg har et lille problem med noget winsock....
jeg har lavet et program der skal være server som sender dataene videre til alle de clienter der connecter... der i har jeg lavet 2 loops en der venter på clients og en der sender den data der kommer ind videre!!
her kommer problemet så.. den vil kun køre den ene loop den anden køere den kun en gang eller undlader helt og køre den...
jeg har lavet det hele under et par {} (hvis i forstår hvad jeg mener) fx inde under en der henner main(blabla)

det skal lige siges at jeg er MEGET ny til c++ jeg har fundet lidt rundt omkring på nettet.. så det er alså heller ik sikkert at det er rigtigt det jeg har lavet...
håber i kan hjælpe
/mad_man
Avatar billede fgsupermand Nybegynder
25. juli 2003 - 11:20 #1
Kan du ikke vise os koden for de 2 loops ? (jeg tror aldrig den bliver færdig med det "inderste" loop og derfor ikke forsætter det "ydre" loop)
Avatar billede mad_man Nybegynder
25. juli 2003 - 11:21 #2
her kommer koden

#include <winsock.h>
#include <iostream>

#define MAXCONN 10

using namespace std;
const int kBufferSize = 1024;

DWORD WINAPI Echo(void* sock_)
{
    int nRetval = 0;
    SOCKET sock = (SOCKET)sock_;
    return 3;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow)
{
    WORD sockVersion;
    WSADATA wsaData;
    int sock;

    sockVersion = MAKEWORD(1, 1);//    WORD (1, 1);
   
    WSAStartup(sockVersion, &wsaData);
   
    SOCKET lytter;
    lytter = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   
    if(lytter == INVALID_SOCKET)
    {
        WSACleanup();
        return 0;
    }
    SOCKADDR_IN srvinf;
    srvinf.sin_family = AF_INET;
    srvinf.sin_addr.s_addr = INADDR_ANY;
    srvinf.sin_port = htons(8888);
   
    sock = bind(lytter, (LPSOCKADDR)&srvinf, sizeof(struct sockaddr));
   
    if(sock == SOCKET_ERROR)
    {
        WSACleanup();
        return 0;
    }
   
    sock = listen(lytter, MAXCONN);
    if(sock == SOCKET_ERROR)
    {
        WSACleanup();
        return 0;
    }
   
    sockaddr_in sinRemote;
    int nAddrSize = sizeof(sinRemote);

    while (1) {
        SOCKET sock = accept(lytter, (sockaddr*)&sinRemote,
                &nAddrSize);
        if (sock != INVALID_SOCKET)
        {
            cout << "Accepted connection from " <<
                    inet_ntoa(sinRemote.sin_addr) << ":" <<
                    ntohs(sinRemote.sin_port) << "." <<
                    endl;

            DWORD nThreadID;
            CreateThread(0, 0, Echo, (void*)sock, 0, &nThreadID);
        }
    }
    char acReadBuffer[kBufferSize];
    int nReadBytes;
    do {
        nReadBytes = recv(sock, acReadBuffer, kBufferSize, 0);
        if (nReadBytes > 0) {
            cout << "Received " << nReadBytes <<
                    " bytes from client." << endl;
       
            int nSentBytes = 0;
            while (nSentBytes < nReadBytes) {
                int nTemp = send(sock, acReadBuffer + nSentBytes,
                        nReadBytes - nSentBytes, 0);
                if (nTemp > 0) {
                    cout << "Sent " << nTemp <<
                            " bytes back to client." << endl;
                    nSentBytes += nTemp;
                }
                else if (nTemp == SOCKET_ERROR) {
                    return false;
                }
                else {
                    cout << "Peer unexpectedly dropped connection!" << endl;
                    return true;
                }
            }
        }
        else if (nReadBytes == SOCKET_ERROR) {
            return false;
        }
    } while (nReadBytes != 0);

    cout << "Connection closed by peer." << endl;
    return true;
}
Avatar billede mad_man Nybegynder
25. juli 2003 - 11:21 #3
ja men hvordan skal det laves... det vil jeg gerne vide
Avatar billede mad_man Nybegynder
25. juli 2003 - 11:32 #4
i dette tilfælde vil jeg mene at de 2 loops bægge skal køre uændeligt men hvordan gør man det
Avatar billede mjohansen Nybegynder
25. juli 2003 - 11:33 #5
Hmm. Du er nødt til at have 2 threads: een til dit "listen" loop og en anden til dit send/recv loop.
Avatar billede mad_man Nybegynder
25. juli 2003 - 11:35 #6
som jeg sagde jeg er MEGA ny.. begynde for en lille uge siden..
threads er det sådanne lige som main() sjoverne
Avatar billede mad_man Nybegynder
25. juli 2003 - 11:37 #7
kan i ik komme med nogle simple eksempler
Avatar billede mjohansen Nybegynder
25. juli 2003 - 11:37 #8
Ja, en thread er jo en procedure der afvikles samtidigt med dit hovedprogram.
Når du kalder accept står den jo og venter på en connection. Derfor er det en idé at putte det loop i en thread. Den anden løkke står og venter i en recv og derfor er det også en idé at lægge den i en anden thread.
Avatar billede mjohansen Nybegynder
25. juli 2003 - 11:39 #9
Avatar billede mjohansen Nybegynder
25. juli 2003 - 11:40 #10
Iøvrigt siger du, at du er meget ny i C++. Det du vil kode er nok i katagorien "avanced" og ikke lige begynderniveau. MEN når du selv får løst opgaven har du lært MEGET!
Avatar billede mad_man Nybegynder
25. juli 2003 - 12:04 #11
jeg kan godt li udfordring =)
tak for hjælpen... så er det bare op til mig og lære det der med thread's
så der kommer point til dig..
og endnu en gang tak
Avatar billede arne_v Ekspert
25. juli 2003 - 12:19 #12
Neg tror absolut at den simpleste kode er:
  1 main thread
  N client threads - 1 thread per client

Main thread listener, accepter og starter en client thread.

Client thread laver så alle send og og receive på socket.

[Det ser iørvigt ud til at du allerede er startet på det concept fordi
du kalder CreateThread i din while loop]
Avatar billede mjohansen Nybegynder
25. juli 2003 - 12:21 #13
Hmmm. Hvis mainthread hænger i en accept....
Ja, det kan man jo godt, hvis man ikke lige skal have et vindue også o.s.v.
Avatar billede arne_v Ekspert
25. juli 2003 - 12:38 #14
Hvis main thread hænger i en accept så er det jo fordi der ikke
kommer nogle nye connections. Og så kører de eksisterende
connections fint videre.

Og den model virker også fint med et vindue.

Det er formentlig langt den største del af al socket kode med
support for multiple connections der kører med en tråd per klient.
Avatar billede bertelbrander Novice
25. juli 2003 - 17:26 #15
Der er et lille thread eksempel her:
http://www.eksperten.dk/spm/365699
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