2013-04-18 4 views
-2

사용자가 인터넷에 연결되어있는 컴퓨터에서 원격으로 가정용 컴퓨터를 제어 할 수있는 작은 프로그램을 만들었지 만 랩톱 컴퓨터에 테스트 명령을 보낼 때마다이 오류가 계속 발생합니다 ...네트워크를 통해 데이터를 전송할 때 오류가 발생 했습니까?

System.ArgumentNullException : 값은 null 일 수 없습니다.

파라미터 명칭 : 버퍼

에서 System.Net.Sockets.NetworkStream.Read (바이트 [] 버퍼 오프셋 INT32, INT32 사이즈)에 svchost.Form1.accept_Client C()에

\ \ 2,012 비주얼 스튜디오 \ 사용자 \ 사무엘 \ 문서 \ 프로젝트 \의 Svchost \의 Svchost \를 Form1.vb : 라인 40

여기 내 코드의 ...

Imports STE 

Public Class Form1 'PS, client_info is a rich text box... 

Private serverListener As New Net.Sockets.TcpListener(9653) 'list for incoming connections 
Private serverSender As New Net.Sockets.TcpClient 'send data back to client 
Private byteFromClient() As Byte 'Allows max of 1024 characters from client. 
Private byteFromServer() As Byte 'Allows max of 1024 characters from server. 
Private stringFromServer As String = "" 
Private stringFromClient As String = "" 
Private streamFromServer As Net.Sockets.NetworkStream 
Private streamFromClient As Net.Sockets.NetworkStream 
Private pendingClient As New Net.Sockets.TcpClient 'client to handle 
Private secure As New STE.Encryption 'encrypt data 

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    Recive.CancelAsync() 
End Sub 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Recive.RunWorkerAsync() 'Start listening thread 
End Sub 

Private Sub Recive_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Recive.DoWork 
    serverListener.Start() 'start listening to incoming information from clients 
    Do While True 
     If serverListener.Pending = True Then 
      Call accept_Client() 
     End If 
     If Recive.CancellationPending = True Then 
      Exit Do 
     End If 
    Loop 
End Sub 

Private Sub accept_Client() 
    Try 
     pendingClient = serverListener.AcceptTcpClient 
     pendingClient.GetStream.Read(byteFromClient, 0, pendingClient.ReceiveBufferSize) 'Error here... 
     stringFromClient = System.Text.Encoding.ASCII.GetString(byteFromClient) 
     client_info.Text = stringFromClient & vbNewLine 
    Catch ex As Exception 
     client_info.Text = ex.ToString 
    End Try 
End Sub 

Private Sub Transmit_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Transmit.DoWork 
    Try 
     Do While serverSender.Connected = False 
      serverSender.Connect("127.0.0.1", 9653) 'connect to local pc (temp)... 
     Loop 
     byteFromServer = System.Text.Encoding.ASCII.GetBytes(commandTB.Text) 
     streamFromServer.Write(byteFromServer, 0, byteFromServer.Length) 'write data to stream 
     streamFromServer.Flush() 'send data 
    Catch ex As Exception 
     MsgBox(ex.ToString & vbNewLine & ex.InnerException.Data.ToString) 
    End Try 
End Sub 

Private Sub send_command_Click(sender As Object, e As EventArgs) Handles send_command.Click 
    Transmit.RunWorkerAsync() 'start thread to transmit data to client 
End Sub 
End Class 

네트워크 프로그래밍은 현재 나에게 취약한 부분이기 때문에 코드에 올바른 논리가 있는지 확실하지 않습니다. 어떤 도움이라도 대단히 감사합니다.

답변

1
Dim byteFromClient(1024) As Byte 
+0

감사합니다. 오류가 발생하지만 아무 것도 발생하지 않습니다. 들어오는 데이터를받지 못했습니다. – Sam

+0

데이터가 배열에 있지만 데이터가 가득 없습니다. 얼마나 많은 데이터가 쓰여져 있는지 확인하려면'Read' 함수의 반환 값을 확인하십시오. 모든 데이터를 읽을 때까지 루프 내에서 데이터를 읽어야합니다. 1K (1024)로 충분하지 않을 수 있습니다. 같은 버퍼로 읽고 있다면'offset'을 설정하여 이전의 읽기 데이터를 덮어 쓰지 않도록주의하십시오. – Xaqron

+0

좋아, 내가 이런 식으로 사용할 수 있을까? 좋은 접근법은 그것을 고정 버퍼를 사용하여 기록 할 내용 : 나 pendingClient.ReceiveBufferSize pendingClient.GetStream.Read (byteFromClient, I, 1024) "동안 정수 = 0 않는 I = I + 1 루프 – Sam

관련 문제