Bonjour,

je travaille sur un client TCP qui se connecte sur un serveur pour envoyer une data avec ( qsock.IOHandler.Write ) puis recuperer la reponse avec ( qsock.IOHandler.ReadStream )


send et receive fonctionnent correctement, sauf que le socket (cote serveur) se met en TIME_WAIT (pendant plusieurs secondes).


ce fameux TIME_WAIT n'apparait pas en utilisant les net.socket de Visual studio


Comment faire pour eviter ce TIME_WAIT ???
est ce qu'il y a une autre facon "plus propre" de fermeture du socket client ??


code delphi XE2

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
 
 
 
//------------------------------------------------------------------------------
function c_send.sendrequete(qreq, qhost : string; var qrep : string;  qport, qtaillerep : integer) : boolean;
var
  qsock : tidtcpclient;
  qtaille, compteur, qreqsize, intverif : integer;
  qbytes: tbytes;
  qread, tenvoie : tmemorystream;
  bbool : boolean;
  qrequete : string;
begin
 
 
result := false;
qrep := '';
c_error := '';
 
 
tenvoie := tmemorystream.Create;
qreqsize := 512;
 
 
qrequete := qreq;
intverif := usabine.private_cryptertmbss(qrequete,usabine.cryptage_tmbss_a,usabine.rempli_550_a,tenvoie,qreqsize);
 
 
if c_read_time_out < 1  then  c_read_time_out := 3000;
if c_connect_time_out < 1  then  c_connect_time_out := 3200;
qsock := tidtcpclient.Create;
 
qsock.Host := qhost;
qsock.Port := qport;
qsock.ReadTimeout := c_read_time_out;
qsock.ConnectTimeout := c_connect_time_out;
 
 
qread := tmemorystream.Create;
qtaille := tenvoie.Size;
setlength(qbytes,qtaille );
tenvoie.Seek(0,soFromBeginning);
tenvoie.ReadBuffer(qbytes[0],qtaille);
tenvoie.Free;
 
 
 
try
  begin   qsock.Connect; qsock.IOHandler.Write(qbytes,qtaille,0);  end;
 
except
  begin
    qread.Free;
    c_error := '<send>'; setlength(qbytes,0);
    if e_debug <> nil then  e_debug.Lines.Add('error_send_private_sendstr_getstr_2') ;
    abort;
  end; //  except
end;
 
 
try
  begin qsock.IOHandler.ReadStream(qread,qtaillerep,true); end;
except
 begin
    qread.Free;
    c_error := '<receive>'; setlength(qbytes,0);
    if e_debug <> nil then e_debug.Lines.Add('error_read_private_sendstr_getstr_3') ;
    abort;
  end; // except
end;
 
 
private_rep_fromstream(qread,qrep);
qread.Free;
 
qsock.IOHandler.CloseGracefully;
qsock.Socket.Close;
qsock.Free;
result := true;
 
end;
 
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------







code Visual studio 2005

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
 
 
 
    Function e__tcpconnect_test(ByVal qdomaine As String, ByVal qport As Integer, Optional ByVal qtimeout As Integer = 5000) As String
 
        Me.btnexe.Enabled = False
 
        Dim tmpbool As Boolean = False
        Dim _socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        Dim unpo As New Net.IPEndPoint(Dns.GetHostEntry(qdomaine).AddressList(0), qport)
        _socket.Ttl = 42
 
        _socket.ReceiveTimeout = 300000
        _socket.ReceiveBufferSize = 90000
 
 
        _socket.Connect(unpo)
 
        Dim OctetsEnvoyes As Integer = 0
        Dim stra As String = "" : Dim str1 As String = ""
 
 
        Try
 
            OctetsEnvoyes = _socket.Send(Me.bsends, SocketFlags.None)
 
 
            Dim Messager(10000) As [Byte]
 
            Dim Octetsrecu As Integer 
 
                Do
                    Octetsrecu = _socket.Receive(Messager, 0, Messager.Length, 0)
                    stra = stra + Encoding.Default.GetString(Messager, 0, Octetsrecu)
                Loop While Octetsrecu > 0
 
 
        Catch e As SocketException
 
            stra = "error : " + vbCrLf + stra
            Return stra
 
        Finally
            _socket.Close(0)
 
            Array.Resize(Me.bsends, 0)
            Me.btnexe.Enabled = True
            stra = stra.Replace(Chr(10), vbCrLf) : Me.edresultat.Text = str1
            Me.edresultat.Text = stra
        End Try
 
        Return stra
 
    End Function