Winsock--Skript pausiert bei accept.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Winsock--Skript pausiert bei accept.

    Ich war gerade einen DOS-Chat am Schreiben und stoße
    auf einen komischen Fehler in meinem Server...

    Quellcode

    1. #include <winsock2.h>
    2. #include <iostream>
    3. using namespace std;
    4. int main (int argc, char* argv[]) {
    5. WSADATA wdData;
    6. if (WSAStartup(MAKEWORD(2, 0), &wdData) == INVALID_SOCKET) {
    7. cout << "Konnte WinSock nicht initialisieren!" << endl;
    8. system ("PAUSE");
    9. return 256;
    10. } else {
    11. cout << "WinSock initialisiert!" << endl;
    12. }
    13. SOCKET sckSocket;
    14. SOCKADDR_IN addrServer;
    15. char Request[100];
    16. /* SOCKADDR_IN erstellen und Port setzen, auf dem er hört. */
    17. addrServer.sin_addr.s_addr = INADDR_ANY; // listen on all IPs associated with this computer
    18. addrServer.sin_port = htons(80); // bind to port 80
    19. addrServer.sin_family = AF_INET;
    20. if ((sckSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
    21. cout << "Konnte keinen Socket erstellen!" << endl;
    22. system ("PAUSE");
    23. return 256;
    24. } else {
    25. cout << "Socket erstellt!" << endl;
    26. }
    27. if (bind(sckSocket, (SOCKADDR *) &addrServer, sizeof(addrServer)) == SOCKET_ERROR) {
    28. cout << "Konnte nicht an Port binden!" << endl;
    29. system ("PAUSE");
    30. return 254;
    31. } else {
    32. cout << "An Port gebunden!" << endl;
    33. }
    34. if (listen(sckSocket, 4) == SOCKET_ERROR) {
    35. cout << "Socket kann nicht hören!" << endl;
    36. system ("PAUSE");
    37. return 253;
    38. } else {
    39. cout << "Socket hört!" << endl;
    40. }
    41. while (true) {
    42. /* Zum Ausgrenzen um die Anzahl und schnelligkeit der Durchläufe zu sehen */
    43. cout << "---" << endl;
    44. SOCKET sckClient = accept(sckSocket, 0, 0);
    45. if (sckClient != INVALID_SOCKET) {
    46. /* Nur 1 Strich und kein 'hier müsste was kommen' Also bleibts bei Accept stehen. */
    47. cout << "hier müsste was kommen!" << endl;
    48. if (recv(sckClient, Request, sizeof(Request), 0) > 0) {
    49. cout << Request << endl;
    50. /* Auf Request antworten. */
    51. char test[] = "hallo zurück";
    52. send (sckSocket, test, 12, 0);
    53. }
    54. }
    55. }
    56. closesocket (sckSocket);
    57. system ("PAUSE");
    58. return 0;
    59. }
    Alles anzeigen


    Undzwar geht's ab accept() nicht weiter.
    Ausgabe:

    WinSock initialisiert!
    Socket erstellt!
    An Port gebunden!
    Socket hört!
    ---
    _ <-- Blinker

    Und dabei bleibt's.
    Mein server versucht über Stunden etwas zu accepten()


    Hier der Client

    Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <winsock2.h>
    4. using namespace std;
    5. int main (int argc, char *argv[]) {
    6. /* Initialisiert Winsock. Programm direkt beenden, wenn nicht möglich. */
    7. WSADATA wdData;
    8. if (WSAStartup (MAKEWORD(2, 2), &wdData) != 0) {
    9. cout << "Konnte WinSock nicht initialisieren!" << endl;
    10. return 0;
    11. } else {
    12. cout << "WinSock gestartet!" << endl;
    13. }
    14. /* Socket erstellen und zurechtsetzen. Programm beenden, falls nicht möglich. */
    15. SOCKET sckSocket;
    16. if ((sckSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
    17. cout << "Konnte keinen Socket erstellen!" << endl;
    18. return 256;
    19. } else {
    20. cout << "Socket erstellt!" << endl;
    21. }
    22. /* SOCKADDR_IN erstellen und Protokoll, Port und Zielserver setzen. */
    23. char ip[] = "85.212.59.39";
    24. SOCKADDR_IN addrServer;
    25. addrServer.sin_family = AF_INET;
    26. addrServer.sin_addr.s_addr = inet_addr(ip);
    27. addrServer.sin_port = htons(80);
    28. /* Socket zum Zielserver verbinden. Programm beenden, falls was schief ging. */
    29. if (connect(sckSocket, (SOCKADDR *) &addrServer, sizeof(addrServer)) == SOCKET_ERROR) {
    30. cout << "Konnte nicht zum Server verbinden!" << endl;
    31. system ("PAUSE");
    32. return 254;
    33. } else {
    34. cout << "Verbunden mit " << ip << "!" << endl;
    35. }
    36. /* Buffer für Request und Receive. */
    37. char Request[] = "Hallo";
    38. char Antwort[100];
    39. /* Request eingeben und zum Server senden. Programm beenden, falls Server nicht empfangen will */
    40. cout << "Sagen> "; cin >> Request;
    41. if (send(sckSocket, Request, 5, 0) <= 0) {
    42. cout << "Server empfängt nichts!" << endl;
    43. system ("PAUSE");
    44. return 253;
    45. } else {
    46. cout << Request << endl;
    47. }
    48. /* Antwort ausgeben. Programm beenden, falls Server nicht antwortet. */
    49. if (recv(sckSocket, Antwort, 100, 0) <= 0) {
    50. cout << "Server antwortet nicht!" << endl;
    51. system ("PAUSE");
    52. return 252;
    53. }
    54. cout << "Request geschickt" << endl;
    55. closesocket (sckSocket);
    56. system ("PAUSE");
    57. return 0;
    58. }
    Alles anzeigen


    Vll. kann mir ja eine rweiterhelfen, meinen Chat zu schreiben.
    Der Benutzername soll später gleich der Windows Benutzername sein.
    Es soll nicht mehr die 2 Programme Server und Cleint sein sondern
    ein programm soll sowohl Server als auch Client sein.
    Wobei ich für das 2te einen visual basic ähnlichen Timer bräuchte,
    da es dort die while (true) nicht macht.