Jag har en tcpclient ansluten till en server och använder mig av följnade kod ungefär: EFtersom du skriver: Hade detta liggande, du kan kanske få lite tips av det.Asynkrona och synkrona operationer LÖST
<CODE>
buffer = System.Text.Encoding.ASCII.GetBytes(sPassword & vbCrLf)
oTelnetStream.Write(buffer, 0, buffer.Length)
ReDim buffer(oSocket.ReceiveBufferSize)
oTelnetStream.Read(buffer, 0, CInt(oSocket.ReceiveBufferSize))
sResponse = Trim(Replace(Microsoft.VisualBasic.Left(System.Text.Encoding.ASCII.GetString(buffer), InStr(System.Text.Encoding.ASCII.GetString(buffer), Chr(0))), vbCrLf, vbNullString))
sResponse = Microsoft.VisualBasic.Right(Trim(sResponse), 1)
If sResponse <> ">" Then
nCounter = nCounter + 1
If nCounter = 4 Then End
GoTo Login
End If
</CODE>
problemet är att i runtime så beter sig både read och Write-metoderna i min stream som om dom vore asynkrona, dvs koden löper vidare utan att ta hänsyn till att en läsning pågår. Hur löser jag det, förslag, länkar, allt ni kan komma på är välkommet!Sv: Asynkrona och synkrona operationer
>allt ni kan komma på är välkommet!
Så kan jag väl komma med det ganska lama förslaget:
Sätt en timer som styr när nästa läsning/skrivning skall ske.
/Niklas JanssonSv: Asynkrona och synkrona operationer
<code>
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Private M_Wait As New ManualResetEvent(False)
Private Sub Connect()
Dim ipAdd As IPAddress
'Parse IP string to correct address
Try
ipAdd = IPAddress.Parse(TextBox2.Text)
Catch ex As FormatException
TextBox1.Text = "Format error on IP address." & vbCrLf
Catch ex As ArgumentNullException
TextBox1.Text = "No IP address has been entered." & vbCrLf
End Try
Dim conHost As New IPEndPoint(ipAdd, 80)
'Create Socket
Dim oSock As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim state As New StateObj()
state.objSock = oSock
M_Wait.Reset()
Dim iAs As IAsyncResult = oSock.BeginConnect(conHost, AddressOf Connect_Callback, state)
M_Wait.WaitOne()
If iAs.IsCompleted Then
TextBox1.Text += "Connected." & vbCrLf
Else
TextBox1.Text += "Connection failed." & vbCrLf
End If
'Skickar
Dim sPassword = "StringToSend"
Dim b As Byte() = Encoding.ASCII.GetBytes(sPassword)
M_Wait.Reset()
iAs = oSock.BeginSend(b, 0, b.Length, SocketFlags.None, AddressOf Send_Callback, state)
M_Wait.WaitOne()
'Tar emot
M_Wait.Reset()
iAs = oSock.BeginReceive(state.buffer, 0, state.BUFFER_SIZE, SocketFlags.Peek, AddressOf Recv_Callback, state)
M_Wait.WaitOne()
End Sub
Private Sub Connect_Callback(ByVal ar As IAsyncResult)
Dim state As StateObj = CType(ar.AsyncState, StateObj)
state.objSock.EndConnect(ar)
M_Wait.Set()
End Sub
Private Sub Send_Callback(ByVal ar As IAsyncResult)
Dim state As StateObj = CType(ar.AsyncState, StateObj)
state.objSock.EndSend(ar)
M_Wait.Set()
End Sub
Private Sub Recv_Callback(ByVal ar As IAsyncResult)
Dim state As StateObj = CType(ar.AsyncState, StateObj)
Dim readBytes = state.objSock.EndReceive(ar)
If readBytes > 0 Then
state.stringBuild.Append(Encoding.ASCII.GetString(state.buffer, 0, readBytes))
state.objSock.BeginReceive(state.buffer, 0, state.BUFFER_SIZE, 0, AddressOf Recv_Callback, state)
Else
TextBox3.Text += state.stringBuild.ToString
state.objSock.Close()
M_Wait.Set()
End If
End Sub
End Class
Public Class StateObj
Public objSock As Socket = Nothing
Public Const BUFFER_SIZE As Int32 = 1024
Public buffer(1024) As Byte
Public stringBuild As New StringBuilder()
End Class
</code>