Winsock 컨트롤 사용
WinSock 컨트롤은 UDP(User Datagram Protocol)나 TCP(Transmission Control Protocol)을 사용하여 원격 장비에 연결하여 데이터를 교환할 수 있게 해줍니다. 이 두 프로토콜을 사용하여 클라이언트와 서버 응용 프로그램을 만들 수 있습니다. Timer 컨트롤과 마찬가지로 WinSock 컨트롤은 실행 모드에서 눈에 보이는 인터페이스를 가지고 있지 않습니다.
가능한 용도
중앙 서버로 보내기 전에 사용자 정보를 모으는 클라이언트 응용 프로그램을 작성합니다.
여러 사용자로부터의 데이터를 중앙으로 모으는 기능을 가진 서버 응용 프로그램을 작성합니다.
“chat” 응용 프로그램을 작성합니다.
프로토콜 선택
WinSock 컨트롤을 사용할 때 먼저 고려해야 할 것은 TCP를 사용할 것인지 UDP 프로토콜을 사용할 것인지를 결정하는 것입니다. 이 두 프로토콜의 가장 큰 차이점은 연결 상태입니다.
TCP 프로토콜 컨트롤은 연결에 기반을 둔 프로토콜이고 전화와 비슷합니다. 사용자는 진행을 하기 전에 반드시 연결을 수행해야 합니다.
UDP 프로토콜은 연결이 필요 없는 프로토콜이고 두 시스템간의 트랜잭션은 메모를 전달하는 것과 비슷합니다. 메시지는 한 시스템에서 다른 시스템으로 보내지지만 두 시스템 사이의 직접적인 연결은 없습니다. 나아가 개인이 보내는 최대 데이터 크기는 네트워크에 따라 정해집니다.
만드는 응용 프로그램의 특성은 일반적으로 어느 프로토콜을 선택해야 할지를 결정합니다. 다음은 적절한 프로토콜을 선택하는 것을 도와주는 몇 가지 질문이 있습니다.
데이터를 보내거나 받을 때 응용 프로그램이 서버나 클라이언트의 승인을 필요로 합니까? 그렇다면 TCP 프로토콜은 데이터를 보내거나 받기 전에 직접적인 연결을 필요로 합니다.
데이터가 이미지나 사운드 파일과 같이 아주 큽니까? 연결이 만들어지면 TCP 프로토콜은 이 연결을 유지하고 데이터의 통합성을 보장합니다. 그러나 이 연결은 더 많은 컴퓨터 자원을 사용하고 이것은 컴퓨터의 가격을 “비싸게” 합니다.
데이터가 간격을 두고 보내집니까 아니면 한번에 보냅니까? 예를 들어, 특정 작업이 완료되었을 때 지정한 컴퓨터에 알려주는 응용 프로그램을 만들 때는 UDP 프로토콜이 더 적절합니다. 또한 UDP 프로토콜은 작은 양의 데이터를 보내는데 더 적절합니다.
프로토콜 설정
응용 프로그램이 사용할 프로토콜을 설정하려면 속성 창의 디자인 모드에서 프로토콜을 누르고 sckTCPProtocol이나 sckUDPProtocol을 선택합니다. 또한 다음과 같이 코드에서 Protocol 속성을 설정할 수 있습니다.
Winsock1.Protocol = sckTCPProtocol
컴퓨터의 이름 결정
원격 시스템에 연결하려면 시스템의 IP 주소나 “친숙한 이름“을 알아야 합니다. IP 주소는 마침표로 구분된 세 자리 숫자의 시리즈입니다(xxx.xxx.xxx.xxx). 일반적으로 시스템의 친숙한 이름을 기억하는 것이 훨씬 쉽습니다.
내 컴퓨터 이름을 찾으려면
[작업 표시줄]에서 [시작]을 누릅니다.
[설정] 항목에서 [제어판]을 누릅니다.
[네트워크] 아이콘을 두 번 누릅니다.
[컴퓨터 확인] 탭을 누릅니다.
사용자 컴퓨터 이름은 [컴퓨터 이름] 상자에서 찾을 수 있습니다.
사용자 컴퓨터 이름을 찾았으면 RemoteHost 속성의 값으로 사용할 수 있습니다.
TCP 연결 기초
TCP 프로토콜을 사용하는 응용 프로그램을 작성할 때 먼저 응용 프로그램이 서버가 될지 클라이언트가 될지를 결정해야 합니다. 서버를 만드는 것은 지정한 포트에서 응용 프로그램이 “응답“하는 것을 의미합니다. 클라이언트가 연결 요청을 만들 때 서버는 요청을 받아들여서 연결을 완료할 수 있습니다. 연결이 완료되면 클라이언트와 서버는 서로 자유롭게 통신할 수 있습니다.
다음 단계를 실행하여 기본 서버를 만듭니다.
TCP 서버를 작성하려면
새 표준 EXE 프로젝트를 만듭니다.
기본 폼의 이름을 frmServer로 바꿉니다.
폼의 캡션을 “TCP 서버“로 바꿉니다.
폼에 Winsock 컨트롤을 만들고 그 이름을 tcpServer로 바꿉니다.
폼에 두 개의 TextBox 컨트롤을 추가합니다. 첫째 컨트롤의 이름은 txtSendData, 그리고 둘째 컨트롤의 이름은 txtOutput으로 정합니다.
아래 코드를 폼에 추가합니다.
Private Sub Form_Load()
‘ LocalPort 속성을 정수로 설정합니다.
‘ Listen 메서드를 불러옵니다.
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show ‘ 클라이언트 폼을 보여줍니다.
End Sub
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
‘ 컨트롤의 상태가 닫혔는지 확인합니다. 닫히지 않았으면
‘ 새 연결을 받아들이기 전에 연결을 종료합니다.
If tcpServer.State <> sckClosed Then tcpServer.Close
‘ requestID 매개 변수를 사용하여 요청을 받아들입니다
tcpServer.Accept requestID
End Sub
Private Sub txtSendData_Change()
‘ txtSendData로 이름 지정된 TextBox 컨트롤은 전송할 데이터를 포함합니다. _
사용자가 입력란에 입력할 때마다 문자열이 SendData 메서드를 사용하여
전송됩니다.
tcpServer.SendData txtSendData.Text
End Sub
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
‘ 들어오는 데이터에 대한 변수를 선언합니다.
‘ GetData 메서드를 불러오고 txtOutput으로 이름이 지정된 TextBox의 Text _
속성을 데이터에 설정합니다.
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
위의 프로서저는 간단한 서버 응용 프로그램을 작성합니다. 그러나 이 시나리오를 완성하려면 클라이언트 응용 프로그램도 만들어야 합니다.
TCP 클라이언트를 만드려면
프로젝트에 새 폼을 추가하고 이름을 frmClient로 정합니다.
폼의 캡션을 TCP 클라이언트로 변경합니다.
폼에 Winsock 컨트롤을 추가하고 그 이름을 tcpClient로 정합니다.
frmClient에 두 개의 TextBox 컨트롤을 추가합니다. 첫째 컨트롤의 이름은 txtSend, 그리고 둘째 컨트롤의 이름은 txtOutput로 정합니다.
폼에 CommandButton 컨트롤을 만들고 그 이름을 cmdConnect로 정합니다.
CommandButton 컨트롤의 캡션을 연결로 바꿉니다.
아래 코드를 폼에 추가합니다.
중요 RemoteHost 속성의 값을 사용자 컴퓨터에 친숙한 이름으로 꼭 바꾸어야 합니다.
Private Sub Form_Load()
‘ Winsock 컨트롤의 이름은 tcpClient입니다.
‘ 메모: 원격 호스트를 지정하려면 IP 주소나(예: “121.111.1.1”) 컴퓨터의 “친숙한” _
이름을 사용할 수 있습니다, 여기에 보여지는 것과 같습니다.
tcpClient.RemoteHost = “RemoteComputerName”
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
‘ Connect 메서드를 불러와서 연결을 시작합니다.
tcpClient.Connect
End Sub
Private Sub txtSendData_Change()
tcpClient.SendData txtSend.Text
End Sub
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub
위의 코드는 간단한 클라이언트–서버 응용 프로그램을 만듭니다. 이 둘을 함께 사용하려면 해당 프로젝트를 실행하고 [연결]을 누릅니다. 그런 다음 한 폼의 txtSendData 입력란에 텍스트를 입력하면 다른 폼의 txtOutput 입력란에 같은 텍스트가 나타납니다.
하나 이상의 연결 요청 적용
위에 설명된 기본 서버는 하나의 연결 요청만 받아들입니다. 그러나 컨트롤 배열을 만들어서 같은 컨트롤을 사용하는 여러 개의 연결 요청을 받아들일 수 있습니다. 이런 경우 연결을 종료할 필요 없이 Index 속성을 설정하여 컨트롤의 새 인스턴스를 만들고 새 인스턴스에서 Accept 메서드를 불러냅니다.
아래 코드는 폼에 sckServer로 명명된 Winsock 컨트롤이 있고 그 Index 속성이 0으로 설정되어 있는 것으로 가정합니다. 그러므로 그 컨트롤은 컨트롤 배열의 부분입니다. 선언 영역에서 모듈 수준 변수 intMax가 선언됩니다. 폼의 Load 이벤트에서 intMax는 0으로 설정되고 배열에 있는 첫째 컨트롤의 LocalPort 속성이 1001로 설정됩니다. 그리고 나면 컨트롤에 “응답” 컨트롤을 작성하는 Listen 메서드를 불러옵니다. 각 연결 요청이 도착하면 코드는 인덱스가 0(“응답” 컨트롤의 값)인지를 확인하기 위해 테스트를 합니다. 인덱스가 0이면 응답 컨트롤은 intMax가 증가하고 그 수를 새 컨트롤 인스턴스를 작성하는 데 사용합니다. 이 새 컨트롤 인스턴스는 연결 요청을 받아들이는 데 사용됩니다.
Private intMax As Long
Private Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End Sub
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub
주요 속성
1. BytesReceived 속성
받은(현재 수신 버퍼에 있는) 데이터의 양을 반환합니다. GetData 메서드를 사용하여 데이터를 검색합니다.
읽기 전용이며 디자인 모드에서는 사용할 수 없습니다
2. State 속성(Winsock 컨트롤)
컨트롤의 상태를 열거 형식으로 반환합니다. 읽기 전용이며 디자인 모드에서는 사용할 수 없습니다.
구문
object.State
object 자리 표시자는 적용 대상 목록에 있는 개체로 평가되는 개체식
데이터 형식
Integer
설정
State 속성에 대한 설정은 다음과 같습니다.
상수 |
값 |
설명 |
sckClosed |
0 |
기본 값. 닫혀 있음 |
sckOpen |
1 |
열려 있음 |
sckListening |
2 |
수신 대기 중 |
sckConnectionPending |
3 |
연결 보류 중 |
sckResolvingHost |
4 |
호스트 고정 중 |
sckHostResolved |
5 |
호스트 고정 완료 |
sckConnecting |
6 |
연결 중 |
sckConnected |
7 |
연결 완료 |
sckClosing |
8 |
피어가 연결을 닫고 있음 |
sckError |
9 |
오류 |
3. RemoteHostIP 속성
원격 컴퓨터의 IP 주소를 반환합니다.
- 클라이언트 응용 프로그램에서는, Connect 메서드로 연결이 이루어진 후 원격 컴퓨터의 IP 문자열이 이 속성에 포함됩니다.
- 서버 응용 프로그램에서는 연결 요청(ConnectionRequest 이벤트)이 들어온 뒤 연결을 시작한 원격 컴퓨터의 IP 문자열이 이 속성에 포함됩니다.
- UDP 프로토콜을 사용할 때는 DataArrival 이벤트가 발생한 후에 UDP 데이터를 보내는 컴퓨터의 IP 주소가 이 속성에 포함됩니다.
구문
object.RemoteHostIP
object 자리 표시자는 적용 대상 목록에 있는 개체로 평가되는 개체식
데이터 형식
string
4. LocalIP 속성
지역 컴퓨터의 IP 주소를 IP 주소 점선 유형(xxx.xxx.xxx.xxx)으로 반환합니다. 읽기 전용이며 디자인 모드에서는 사용할 수 없습니다.
구문
object.LocalIP
object 자리 표시자는 적용 대상 목록에 있는 개체로 평가되는 개체식
데이터 형식
문자열
5. Protocol 속성(Winsock 컨트롤)
Winsock 컨트롤에서 사용되는 TCP 또는 UDP 프로토콜을 설정하거나 반환합니다.
구문
object.Protocol [=protocol]
object 자리 표시자는 적용 대상 목록에 있는 개체로 평가되는 개체식
설정
protocol 설정은 다음과 같습니다.
상수 |
값 |
설명 |
sckTCPProtocol |
0 |
기본값. TCP 프로토콜 |
sckUDPProtocol |
1 |
UDP 프로토콜 |
참고
이 속성을 재설정하기 전에 Close 메서드를 사용하여 컨트롤을 반드시 닫아야 합니다.
주요 메소드
1. Accept 메서드
TCP 서버 응용 프로그램에서만 사용됩니다. 이 메서드는 ConnectionRequest 이벤트를 처리할 때 들어오는 연결을 받기 위해 사용됩니다.
구문
object.Accept requestID
object 자리 표시자는 적용 대상 목록에 있는 개체로 평가되는 개체식
데이터 형식
Long
참고
Accept 메서드는 ConnectionRequest 이벤트에서 사용됩니다. ConnectionRequest 이벤트는 Accept 메서드로 전달되어야 하는 대응 인수, 즉 RequestID 매개 변수를 가지고 있습니다. 다음은 그 예제입니다.
Private Sub Winsock1_ConnectionRequest _
(ByVal requestID As Long)
‘ State
속성을 검사하여 연결이 현재 열려 있으면
‘
연결을 닫습니다.
If Winsock1.State <> sckClosed Then Winsock1.Close
‘ requestID
매개 변수 값을 Accept 메서드에 전달합니다.
Winsock1.Accept requestID
End Sub
Accept 메서드는 수신 대기 상태가 아닌 새 컨트롤 인스턴스에 사용해야 합니다.
2. Bind 메서드
TCP 연결에 사용되는 LocalPort 및 LocalIP를 지정합니다. 여러 프로토콜 어댑터가 있을 경우에 이 메서드를 사용합니다.
구문
object.Bind LocalPort, LocalIP
Bind 메서드 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
Object |
적용 대상 목록에 있는 개체로 평가되는 개체식 |
LocalPort |
연결할 때 사용된 포트 |
LocalIP |
연결할 때 사용된 지역 인터넷 주소 |
참고
Listen 메서드를 호출하기 전에 Bind 메서드를 호출해야 합니다.
3. Close 메서드(Winsock 컨트롤)
클라이언트와 서버 응용 프로그램에 모두 사용되는 TCP 연결 또는 수신 대기 소켓을 닫습니다.
4. GetData 메서드(Winsock 컨트롤)
현재 데이터 블록을 검색하여 variant 형식 변수에 저장합니다.
반환값
Void
구문
object.GetData data, [type,] [maxLen]
GetData 메서드 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
Object |
적용 대상 목록에 있는 개체로 평가되는 개체식 |
data |
메서드가 성공적으로 반환된 후에 검색 데이터가 저장될 장소. 요구된 형식에 사용 가능한 데이터가 충분히 없으면 data는 Empty로 설정됩니다. |
Type |
선택적. 설정에 나타난 것 같이 검색될 데이터 형식 |
MaxLen |
선택적. 바이트 배열이나 문자열을 받을 때 원하는 길이를 지정합니다. 바이트 배열이나 문자열에 이 인수를 생략하면, 사용 가능한 모든 데이터가 검색됩니다. 바이트 배열이나 문자열이 아닌 데이터에 이 인수를 설정하면 무시됩니다. |
설정
type 설정은 다음과 같습니다.
설명 |
상수 |
Byte |
vbByte |
Integer |
vbInteger |
Long |
vbLong |
Single |
vbSingle |
Double |
vbDouble |
Currency |
vbCurrency |
Date |
vbDate |
Boolean |
vbBoolean |
SCODE |
vbError |
String |
vbString |
Byte Array |
vbArray + vbByte |
참고
DataArrival 이벤트에는 totalBytes 인수를 가진 GetData 메서드를 사용하는 것이 일반적입니다. maxlen를 totalBytes 인수보다 적게 지정하면 남은 바이트는 분실된다는 10040 경고 메시지를 받게 됩니다.
5. Listen 메서드
소켓을 만들어 수신 모드로 설정합니다. 이 메서드는 TCP 연결에서만 작동합니다.
구문
object.Listen
object 자리 표시자는 적용 대상 목록에 있는 개체로 평가되는 개체식
참고
ConnectionRequest 이벤트는 연결 요청이 들어왔을 때 발생합니다. ConnectionRequest를 처리할 때 응용 프로그램은(새 컨트롤 인스턴스에) Accept 메서드를 사용하여 연결을 받아들여야 합니다.
6. PeekData 메서드
GetData와 유사하지만 PeekData는 입력 대기열에서 데이터를 삭제하지 않습니다. 이 메서드는 TCP 연결에서만 작동합니다.
구문
object.PeekData data, [type,] [maxLen]
PeekData 메서드 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
object |
적용 대상 목록에 있는 개체로 평가되는 개체식 |
data |
메서드가 성공적으로 반환된 다음 검색된 데이터를 저장합니다. 요구한 형식으로 사용할 수 있는 데이터가 없으면 data는 Empty로 설정됩니다. |
Type |
선택. 설정에 설명된 것과 같이 검색되는 데이터의 형식. 기본값: vbArray + vbByte. |
maxLen |
선택. 바이트 배열이나 문자열을 받을 때 원하는 길이를 지정합니다. 바이트 배열이나 문자열에 대해 이 인수를 생략하면 사용할 수 있는 모든 데이터가 검색됩니다. 바이트 배열이나 문자열이 아닌 데이터 형식에 이 인수를 설정하면 무시됩니다. |
설정
type 설정은 다음과 같습니다.
형식 |
상수 |
Byte |
vbByte |
Integer |
vbInteger |
Long |
vbLong |
Single |
vbSingle |
Double |
vbDouble |
Currency |
vbCurrency |
Date |
vbDate |
Boolean |
vbBoolean |
SCODE |
vbError |
String |
vbString |
Byte Array |
vbArray + vbByte |
참고
형식이 vbString으로 지정되면 문자열 데이터는 사용자에게 반환되기 전에 UNICODE로 전환됩니다.
7. SendData 메서드
원격 컴퓨터에 데이터를 보냅니다.
구문
object.SendData data
SendData 메서드 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
object |
적용 대상 목록에 있는 개체로 평가되는 개체식 |
data |
보낼 데이터. 이진 데이터에는 바이트 배열이 사용되어야 합니다. |
참고
UNICODE 문자열이 전달되면 네트워크로 보내기 전에 ANSI 문자열로 전환됩니다.
주요 이벤트
1. Close 이벤트
원격 컴퓨터가 연결을 닫을 때 발생합니다. 응용 프로그램은 Close 메서드를 사용해야 TCP 연결을 올바르게 닫아야 합니다.
2. Connect 이벤트(Winsock 컨트롤)
Connect 작업이 완료되었을 때 발생합니다.
구문
object.Connect()
object 자리 표시자는 Winsock 컨트롤로 평가되는 개체식을 나타냅니다.
참고
Connect 이벤트를 사용하면 연결이 성공적으로 수행된 때가 언제인지 확인할 수 있습니다.
3. ConnectionRequest 이벤트
원격 컴퓨터가 연결을 요청할 때 발생합니다.
- TCP 서버 응용 프로그램에서만 사용됩니다. 이 이벤트는 연결 요청이 들어올 때 발생합니다. 이벤트가 활성화된 후 클라이언트 정보가 RemoteHostIP와 RemotePort 속성에 저장됩니다.
구문
object_ConnectionRequest (requestID As Long)
ConnectionRequest 이벤트 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
object |
적용 대상 목록에 있는 개체로 평가되는개체식. |
requestID |
들어오는 연결 요청 식별자. 이 인수는 둘째 컨트롤 인스턴스의 Accept 메서드에 전달되어야 합니다. |
참고
서버는 연결을 받아들일지 여부를 결정할 수 있습니다. 들어오는 연결 요청이 거부되면 피어(클라이언트)는 Close 이벤트를 받게 됩니다. 새 컨트롤 인스턴스에 Accept 메서드를 사용하여 들어오는 연결을 받아들입니다.
4. DataArrival 이벤트
새 데이터가 도착할 때 발생합니다.
구문
object_DataArrival (bytesTotal As Long)
DataArrival 이벤트 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
Object |
적용 대상 목록에 있는 개체로 평가되는 개체식 |
bytesTotal |
Long. 검색 가능한 데이터의 전체 길이 |
참고
한번의 GetData 호출로 모든 데이터를 검색해야 이 이벤트가 발생합니다. 새 데이터가 있을 때만 이벤트가 활성화됩니다. BytesReceived 속성을 사용하면 사용할 수 있는 데이터의 양을 언제든지 확인할 수 있습니다.
5. Error 이벤트 (Winsock 컨트롤)
배경 프로세스(예를 들면 연결 실패, 배경에서 보내기 또는 받기 실패 등)에서 오류가 발생할 때마다 발생합니다.
구문
object_Error(number As Integer, Description As String, Scode As Long, Source As String, HelpFile as String, HelpContext As Long, CancelDisplay As Boolean)
Error 이벤트 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
object |
적용 대상 목록에 있는 개체로 평가되는 개체식 |
number |
오류 코드를 정의하는 정수. 상수는 아래 설정을 참조합니다. |
description |
오류 정보를 포함하는 문자열 |
Scode |
long SCODE |
Source |
오류 원인을 설명하는 문자열 |
HelpFile |
도움말 파일 이름을 포함하는 문자열 |
HelpContext |
도움말 파일 구문 |
CancelDisplay |
표시 취소 여부를 지정합니다. 기본 값은 False이며, 기본값 오류 메시지 상자를 표시하게 됩니다. 기본값 메시지 상자를 사용하지 않으려면 CancelDisplay를 True로 설정합니다. |
설정
number 설정은 다음과 같습니다.
상수 |
값 |
설명 |
sckOutOfMemory |
7 |
메모리가 부족합니다. |
SckInvalidPropertyValue |
380 |
속성값이 잘못되었습니다. |
SckGetNotSupported |
394 |
속성을 읽을 수 없습니다. |
SckSetNotSupported |
383 |
읽기 전용 속성입니다. |
SckBadState |
40006 |
요청한 트랜잭션이나 요청에 대한 프로토콜 또는 연결 상태가 잘못되었습니다. |
SckInvalidArg |
40014 |
함수에 전달된 인수의 유형 또는 지정 범위가 잘못되었습니다. |
SckSuccess |
40017 |
성공적으로 수행되었습니다. |
SckUnsupported |
40018 |
지원하지 않는 변수 형식입니다. |
SckInvalidOp |
40020 |
현재 상태에서 작업이 잘못되었습니다. |
SckOutOfRange |
40021 |
인수가 범위를 벗어났습니다. |
SckWrongProtocol |
40026 |
요청한 트랜잭션 또는 요청에 대한 프로토콜이 잘못되었습니다. |
SckOpCanceled |
1004 |
작업이 취소되었습니다. |
SckInvalidArgument |
10014 |
요청된 주소는 동시 전송 주소이지만 플래그가 설정되지 않았습니다. |
SckWouldBlock |
10035 |
블록화되지 않은 소켓입니다. 지정된 작업은 블록화되어 있습니다. |
SckInProgress |
10036 |
Winsock 블록화 작업이 진행 중입니다. |
SckAlreadyComplete |
10037 |
작업이 완료되었습니다. 진행 중인 블록화 작업이 없습니다. |
SckNotSocket |
10038 |
설명자가 소켓이 아닙니다. |
SckMsgTooBig |
10040 |
버퍼에 맞추기에는 데이터그램이 너무 커서 잘렸습니다. |
SckPortNotSupported |
10043 |
지정된 포트는 지원되지 않습니다. |
SckAddressInUse |
10048 |
사용 중인 주소입니다. |
SckAddressNotAvailable |
10049 |
지역 컴퓨터에서 사용 가능한 주소가 아닙니다. |
SckNetworkSubsystemFailed |
10050 |
네트워크 서브 시스템이 실패하였습니다. |
SckNetworkUnreachable |
10051 |
지금 이 호스트에서 네트워크 액세스를 할 수 없습니다. |
SckNetReset |
10052 |
SO_KEEPALIVE가 설정되었을 때 연결 시간이 초과되었습니다. |
SckConnectAborted |
11053 |
시간 초과 또는 다른 실패로 인하여 연결이 취소되었습니다. |
SckConnectionReset |
10054 |
원격 컴퓨터에 의해 연결이 재설정 되었습니다. |
SckNoBufferSpace |
10055 |
사용 가능한 버퍼 공간이 없습니다. |
SckAlreadyConnected |
10056 |
이미 연결된 소켓입니다. |
SckNotConnected |
10057 |
소켓이 연결되지 않았습니다. |
SckSocketShutdown |
10058 |
소켓이 종료되었습니다. |
SckTimedout |
10060 |
소켓이 종료되었습니다. |
SckConnectionRefused |
10061 |
연결이 강제로 거부되었습니다. |
SckNotInitialized |
10093 |
WinsockInit를 먼저 호출해야 합니다. |
SckHostNotFound |
11001 |
귄위있는 대답: 호스트 컴퓨터를 찾을 수 없습니다. |
SckHostNotFoundTryAgain |
11002 |
귄위없는 대답: 호스트 컴퓨터를 찾을 수 없습니다. |
SckNonRecoverableError |
11003 |
회복 불가능한 오류입니다. |
SckNoData |
11004 |
유효한 이름입니다. 요청한 형식의 데이터 레코드가 없습니다. |
6. SendComplete 이벤트
전송 작업이 완료된 후에 발생합니다.
7. SendProgress 이벤트
데이터가 전송되는 중에 발생합니다.
구문
object_SendProgress (bytesSent As Long, bytesRemaining As Long)
SendProgress 이벤트 구문은 다음과 같은 구성 요소로 되어 있습니다.
구성 요소 |
설명 |
object |
적용 대상 목록에 있는 개체로 평가되는 개체식 |
BytesSent |
이 이벤트가 마지막으로 활성화된 이후 전송된 바이트 수 |
BytesRemaining |
보내기 위해 전송 버퍼에 대기 중인 바이트 수
|