SorgenkindMech: fsockopen zerowindow erkennen

hallo liebe leute,

ich stehe hier gerade vor einem kleinen problem, sprich ich weiß schon woran es liegt (denke ich zumindest ;)

ich versuche eine mail zu senden, sprich ich bauer per fsockopen eine verbindung zum mailserver auf, authentifiziere mich, sende den mailbody, und sobald ich nun versuche anhänge dran zu packen hab ich ein problem

denn es kommt der fehler: Notice: fputs() [function.fputs]: send of 78 bytes failed with errno=10035 Ein nicht blockierender Socketvorgang konnte nicht sofort ausgeführt werden.

interessant finde ich, dass er sagt es sei ein nicht blockierender vorgang, obwohl get_meta_data folgendes ausgibt:
Array ( [stream_type] => tcp_socket/ssl [mode] => r+ [unread_bytes] => 0 [seekable] => [timed_out] => 1 [blocked] => 1 [eof] => )

nunja, laut wireshark ist es wohl so, dass der mailserver ein zerowindow sendet, sprich, dass wohl zur zeit sein puffer voll ist und erstmal keine weiteren daten empfangen kann.

die frage ist nun, wie kann ich das mittels php erkennen?

weil solange der server sagt, dass er grad nicht kann, brauch ich ja keine daten senden ... führt ja nur zu fehlern, und dann ist ja noch die frage, ab wann kann ich wieder senden ;(

hat von euch jemand erfahrung damit?

  1. Hallo,

    ich versuche eine mail zu senden, sprich ich bauer per fsockopen eine verbindung zum mailserver auf, authentifiziere mich, sende den mailbody, und sobald ich nun versuche anhänge dran zu packen hab ich ein problem

    a) warum machst Du das von Hand zu Fuß?
    b) Attachments gehören zum mailbody, wenn man's schon von Hand zu Fuß macht ...

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      ich versuche eine mail zu senden, sprich ich bauer per fsockopen eine verbindung zum mailserver auf, authentifiziere mich, sende den mailbody, und sobald ich nun versuche anhänge dran zu packen hab ich ein problem

      a) warum machst Du das von Hand zu Fuß?

      weil ich dadurch vielleicht was lernen kann ;)

      b) Attachments gehören zum mailbody, wenn man's schon von Hand zu Fuß macht ...

      ja ok, haste recht, verzeih mir meine fehlerhafte ausdrucksweise ;)

      ich hab es übrigens im moment so gelöst:

        
      $versuch=1;  
      while(!@fputs($stream, $string))  
      {  
      	if($versuch<15)  
      	{  
      		sleep(5);  
      		$versuch++;  
      	}  
      	else  
      	{  
      		echo "FEHLER BEIM SENDEN VON DATEN";  
      		return false;  
      	}  
      }  
      
      

      aber das finde ich sehr unschön ... zumal dies unnötig zeit zur ausführung in anspruch nimmt finde ich

      übrigens finde ich interessant, dass dieses problem immer nach ca 70 kb an versandten daten auftritt, also zwichen 60 und 80 kb, dann läuft halt meine schleife und danach geht auf einmal alles ganz flott durch, er hat halt immer diesen einen hänger, seltsam oder?

  2. Hallo,

    weil solange der server sagt, dass er grad nicht kann, brauch ich ja keine daten senden ... führt ja nur zu fehlern, und dann ist ja noch die frage, ab wann kann ich wieder senden ;(

    wenn die Gegenstelle sagt, dass Du wieder darfst.

    <zitat abschitt="Flow control">
        However, if the sender is faster than the receiver, e.g. has a faster CPU,
        incoming data will eventually fill the receiver's buffer, causing the
        receiver to advertise a zero window. A sender that receives a zero window
        advertisement must stop sending until it receives a positive window.
    </zitat>

    Andere Frage: warum verwendest Du den non-blocking-Modus?

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      weil solange der server sagt, dass er grad nicht kann, brauch ich ja keine daten senden ... führt ja nur zu fehlern, und dann ist ja noch die frage, ab wann kann ich wieder senden ;(

      wenn die Gegenstelle sagt, dass Du wieder darfst.

      <zitat abschitt="Flow control">
          However, if the sender is faster than the receiver, e.g. has a faster CPU,
          incoming data will eventually fill the receiver's buffer, causing the
          receiver to advertise a zero window. A sender that receives a zero window
          advertisement must stop sending until it receives a positive window.
      </zitat>

      danke, das prinzip war mir schon klar, ist auch soweit völlig in ordnung, muss ja irgendwie eine art info geben wenn er schwächelt ;)

      und hier steht eben die frage, woher bekomme ich die info? ich habe die info per wireshark erhalten, nur mein php scheint davon nichts zu wissen ;(

      Andere Frage: warum verwendest Du den non-blocking-Modus?

      das frage ich mich auch
      laut stream_get_meta... steht blocking auf true, und ich setze auch explizit auf blocking, aber die fehlermeldung sagt eben was anderes

      vielleicht hierzu infos zur umgebung:
      IIS7.5
      PHP 5.2.0 als ISAPI-Modul

      Freundliche Grüße

      Vinzenz