Blocking Call Problem bzgl Socketprogrammierung



  • Hi zusammen,

    ich sitze seit heute morgen am selben Problem. Google und RTFM haben mir nicht geholfen.
    Ich möchte ein Programm schreiben das folgendes macht:
    (das essentielle davon ist schon realisiert und tut auch)

    Es soll Texte übers LAN empfangen und senden (simpler Chat)
    Da send() und recv() stehen bleiben bis was passiert, habe ich nonblocking aktiviert.
    Allerdings tut das ganze in meiner Schleife(n) nicht und ich weiss nicht woran es liegt.
    Bin für jede Hilfe dankbar! Danke im Vorraus!
    Das Thema Threads bitte nicht ansprechen, ich möchte es erst zum laufen bringen und auch nicht mit select() oder sonstigem. 😉

    Codefragment:

    acceptSocket = accept(mysocket,NULL,NULL);
    
    if(acceptSocket > 0)
    
    {
    cout << "Client connected" << endl;
    
    u_long nonBlocking;
    nonBlocking=1; // Mit 0 könnte man das später wieder rückgängig machen...
    ioctlsocket(acceptSocket,FIONBIO,&nonBlocking);
    
    for(;;)
    {
    
    char incoming[256];
    
    int rec=0;
    
    rec = recv(acceptSocket, incoming, strlen(incoming),0);
    
    while(rec!=0)
    {
    char welcome[256];
    cout << "Type in message: " << endl;
    cin.getline(welcome, strlen(welcome));
    send(acceptSocket, welcome, strlen(welcome) + 1, NULL);
    }
    
    cout << "Incoming: " << incoming << endl;
    
    }
    




  • select schrieb:

    select() ist die Lösung.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/winsock_functions.asp

    boah echt? threads auch 😃
    aber so muss es auch gehen!



  • Allerdings tut das ganze in meiner Schleife(n) nicht und ich weiss nicht woran es liegt.

    Tolle Fehlerbeschreibung. Und tolle Fehlerbehandlung in deinem Code.

    Und die Bedingung der while-Schleife ist auch ziemlich komisch.



  • select ist die Lösung schrieb:

    Allerdings tut das ganze in meiner Schleife(n) nicht und ich weiss nicht woran es liegt.

    Tolle Fehlerbeschreibung. Und tolle Fehlerbehandlung in deinem Code.

    Und die Bedingung der while-Schleife ist auch ziemlich komisch.

    Das Errorhandling habe ich extra raus damit es übersichtlicher ist.

    Das Programm soll foldendes tun: Daten empfangen und gleich ausgeben wenn welche empfangen wurden.
    Falls keine empfangen wurden soll man senden können.



  • Ich muss dich enttäuschen. Leider blockt recv bis Daten ankommen. Das Problem hab ich auch. Eine Lösung ist select(), die du aber nicht haben möchtest. Eine andere ist setsockopt(). Dort kann man das timeout für das Socket setzen. Aber so ganz toll ist das auch nicht.


Anmelden zum Antworten