winsock: server braucht Ewigkeit für Antwort.

  • winsock: server braucht Ewigkeit für Antwort.

    Tach nochmal.
    Also wie mein title schon sagt.
    sry wenn ich's kurz mache:

    Quellcode

    1. #include <windows.h>
    2. #include <string>
    3. #include <stdio.h>
    4. using namespace std;
    5. /* Prototypen */
    6. long getAddrFromString (char* hostnameOrIp, SOCKADDR_IN* addr);
    7. /* Einstiegsfunktion */
    8. int WINAPI WinMain (HINSTANCE hThisInstance,
    9. HINSTANCE hPrevinstance,
    10. LPSTR lpCmdLine,
    11. int iCommands) {
    12. /* WinSock starten. Wenn fehlschlägt, kannste alles vergessen */
    13. WSADATA wsa;
    14. long rc = WSAStartup (MAKEWORD(2, 0), &wsa);
    15. if (rc == 0) {
    16. /* Host und Clientheader-Variablen. */
    17. char host[] = "meinhost.de";
    18. string client = "";
    19. client += "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n";
    20. client += "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
    21. client += "Accept -Encoding: gzip , deflate\r\n";
    22. client += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
    23. client += "Connection: keep -alive\r\n";
    24. client += "Keep-Alive: 300\r\n";
    25. /* Buffer bereitstellen */
    26. string req;
    27. string stl;
    28. char antwort[1000];
    29. /* Kann Keiner erstellt werden, ist ebenfalls Schluss */
    30. int s = socket(AF_INET, SOCK_STREAM, 0);
    31. if (s != INVALID_SOCKET) {
    32. /* Socket zum Host verbinden. */
    33. sockaddr_in addr;
    34. addr.sin_family = AF_INET;
    35. addr.sin_port = htons(80);
    36. /* Alles abbrechen, wenn Host-IP nicht aufgelöst werden konnte. */
    37. rc = getAddrFromString(host, &addr);
    38. if (rc != SOCKET_ERROR) {
    39. /* Alles abbrechen, wenn nicht zum Host verbinden konnte. */
    40. rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    41. if (rc != -1) {
    42. /* An Host senden und per MessageBox bestätigen! */
    43. req = "GET /tell.php?test=hi HTTP/1.1\r\n";
    44. req += "Host: "; req += host; req += "\r\n";
    45. req += client;
    46. req += "\r\n";
    47. MessageBox (0, req.c_str(), "anfrage", MB_ICONINFORMATION);
    48. /* Antwort lesen und per MessageBox bestätigen. */
    49. rc = recv(s, antwort, 1000, 0);
    50. if (rc != 0) {
    51. MessageBox (0, antwort, "antwort", MB_ICONINFORMATION);
    52. }
    53. }
    54. }
    55. }
    56. }
    57. return 0;
    58. }
    59. // --- Zum Verbinden zum Host per Hostname.
    60. long getAddrFromString (char* hostnameOrIp, SOCKADDR_IN* addr) {
    61. long rc;
    62. unsigned long ip;
    63. HOSTENT* he;
    64. /* Parameter prüfen */
    65. if (hostnameOrIp==NULL || addr==NULL)
    66. return SOCKET_ERROR;
    67. /* eine IP in hostnameOrIp ? */
    68. ip = inet_addr(hostnameOrIp);
    69. /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
    70. if(ip != INADDR_NONE) {
    71. addr->sin_addr.s_addr=ip;
    72. return 0;
    73. } else {
    74. /* Hostname in hostnameOrIp auflösen */
    75. he = gethostbyname(hostnameOrIp);
    76. if (he == NULL) {
    77. return SOCKET_ERROR;
    78. } else {
    79. /*die 4 Bytes der IP von he nach addr kopieren */
    80. memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
    81. }
    82. return 0;
    83. }
    84. }
    Alles anzeigen


    Das Programm schmeisst mir den korrekten request
    nochmal in einer MessageBox, dann war's das.
    Das Programm läuft noch stundenlang wie ich im
    Taskmanager sehen kann, aber eien Antwort vom
    Server wird nie in einer MessageBox ausgegeben...

    Ganz egal welchen Host, google.de, funpic.de etc.

    Was zur Hölle ist da falsch?
  • Kann es sein, dass nach dem Header ein zweites "\r\n" kommen muss?

    Und ich glaube nicht, dass du zum Server eine "keep -alive" Verbindung willst (meines Wissens nach wird das auch nur "keep-alive" geschrieben). Du willst eine einmalige Verbindung, also lass das weg.
    "Accept -Encoding" schreibt man auch ohne Leerzeichen, und du unterstützt kein "gzip " -> lass es weg (das Leerzeichen ist auch fehlerhaft)
    Lass das Flag "Keep-Alive: 300" auch weg

    hth