CSocket에 관한 세 가지 실용적인 질문!
방금 MSDN에 대한 설명을 잘못 읽었습니다.
CSocket::Create
Windows 소켓을 생성하기 위해 소켓 객체를 생성한 후 Create 멤버 함수를 호출하고 첨부하세요.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL p>
);
매개변수
nSocketPort
소켓과 함께 사용할 특정 포트 또는 MFC가 포트를 선택하도록 하려면 0 .
nSocketType
SOCK_STREAM 또는 SOCK_DGRAM.
lpszSocketAddress
연결된 소켓의 네트워크 주소를 포함하는 문자열에 대한 포인터, "128.56.22.8"과 같은 점으로 구분된 숫자입니다.
반환 값
함수가 성공하면 0이 되고, 그렇지 않으면 0이 되며, GetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다. p>
설명
Create는 Bind를 호출하여 소켓을 지정된 주소에 바인딩합니다. 다음 소켓 유형이 지원됩니다.
SOCK_STREAM 순차적이고 안정적인 양방향을 제공합니다. 연결 기반 바이트 스트림. 인터넷 주소 계열에 TCP(전송 제어 프로토콜)를 사용합니다.
SOCK_DGRAM 고정된(일반적으로 작은) 최대 길이의 신뢰할 수 없는 버퍼인 데이터그램을 지원합니다. (UDP) 이 옵션을 사용하려면 CArchive 개체와 함께 소켓을 사용하면 안 됩니다.
참고
Accept 멤버 함수는 새 항목에 대한 참조를 사용합니다. , 빈 CSocket 개체를 매개 변수로 구성해야 합니다.
Accept를 호출하기 전에 개체를 삭제하세요. 이 소켓 개체가 범위를 벗어나면 연결이 닫힙니다. 이 새 소켓 개체에 대해 Create를 호출하지 마세요.
---------- ------------
sendto
sendto 함수는 데이터를 특정 대상으로 보냅니다.
int sendto(
SOCKET s,
const char* buf,
int len,
int 플래그,
const struct sockaddr* to,
int tolen
);
매개변수
s
[in] 설명자( 연결될 수 있음) 소켓.
buf
[in] 전송할 데이터가 포함된 버퍼
len
[in] 길이
플래그
[in] 호출이 이루어지는 방식을 지정하는 표시자
[in] 대상 소켓의 주소를 포함하는 sockaddr 구조에 대한 선택적 포인터
tolen
[in] 주소의 크기(바이트). /p>
반환 값
오류가 발생하지 않으면 sendto는 전송된 총 바이트 수를 반환합니다. 이 수는 len으로 표시된 숫자보다 작을 수 있습니다. 그렇지 않으면 SOCKET_ERROR 값이 반환됩니다. 특정 오류 코드는 WSAGetLastError를 호출하여 검색할 수 있습니다.
오류 코드 의미
WSANOTINITIALISED 이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN 네트워크. 하위 시스템이 실패했습니다.
WSAEACCES 요청된 주소는 브로드캐스트 주소이지만 사용을 허용하려면 SO_BROADCAST 매개변수와 함께 적절한 플래그가 설정되지 않았습니다.
WSAEINVAL 알 수 없는 플래그가 지정되었거나 SO_OOBINLINE이 활성화된 소켓에 대해 MSG_OOB가 지정되었습니다.
WSAEINTR WSACancelBlockingCall을 통해 차단하는 Windows 소켓 1.1 호출이 취소되었습니다. /p>
WSAEINPROGRESS 차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리 중입니다.
WSAEFAULT buf 또는 to 매개변수가 사용자 주소 공간의 일부가 아닙니다. 또는 tolen 매개변수가 너무 작습니다.
WSAENETRESET 작업이 진행되는 동안 연결 유지 활동이 실패를 감지하여 연결이 끊어졌습니다.
WSAENOBUFS 사용 가능한 버퍼 공간이 없습니다. .
WSAENOTCONN 소켓이 연결되지 않았습니다(연결 지향 소켓에만 해당).
WSAENOTSOCK 설명자가 소켓이 아닙니다.
WSAEOPNOTSUPP MSG_OOB가 지정되었습니다. 소켓이 SOCK_STREAM 유형과 같은 스트림 스타일이 아니거나, OOB 데이터가 이 소켓과 연관된 통신 도메인에서 지원되지 않거나, 소켓이 단방향이고 수신 작업만 지원합니다.
WSAESHUTDOWN 소켓이 종료되었습니다. down; SD_SEND 또는 SD_BOTH로 설정된 상태로 종료가 호출된 후에는 소켓에 sendto를 보낼 수 없습니다.
WSAEWOULDBLOCK 소켓은 비차단으로 표시되고 요청된 작업은 차단됩니다.
WSAEMSGSIZE 소켓은 메시지 지향적이며 메시지는 기본 전송에서 지원하는 최대값보다 큽니다.
WSAEHOSTUNREACH 원격 호스트 c.
지금은 이 호스트에서 연결할 수 없습니다.
WSAECONNABORTED 가상 회로가 시간 초과 또는 기타 오류로 인해 종료되었으므로 더 이상 사용할 수 없습니다.
WSAECONNRESET 가상 회로가 하드 닫기 또는 중단된 닫기를 실행하여 재설정되었습니다. UPD 소켓의 경우 원격 호스트가 이전에 전송된 UDP 데이터그램을 전달할 수 없어 "포트에 연결할 수 없음" ICMP 패킷으로 응답해야 합니다. 더 이상 사용할 수 없으므로 소켓을 닫습니다.
WSAEADDRNOTAVAIL 원격 주소는 유효한 주소가 아닙니다(예: ADDR_ANY).
WSAEAFNOSUPPORT 지정된 계열의 주소는 이 주소와 함께 사용할 수 없습니다. 소켓.
WSAEDESTADDRREQ 대상 주소가 필요합니다.
WSAENETUNREACH 지금은 이 호스트에서 네트워크에 연결할 수 없습니다.
WSAEHOSTUNREACH 소켓 작업이 시도되었습니다. 연결할 수 없는 호스트입니다.
WSAETIMEDOUT 네트워크 오류로 인해 또는 상대방의 시스템이 예고 없이 다운되어 연결이 끊어졌습니다.
비고
sendto 함수는 소켓에 나가는 데이터를 쓰는 데 사용됩니다. 메시지 지향 소켓의 경우 소켓 옵션 값을 검색하기 위해 getsockopt를 사용하여 얻을 수 있는 기본 서브넷의 최대 패킷 크기를 초과하지 않도록 주의해야 합니다. SO_MAX_MSG_SIZE. 데이터가 너무 길어서 기본 프로토콜을 통해 원자적으로 전달할 수 없으면 WSAEMSGSIZE 오류가 반환되고 데이터가 전송되지 않습니다.<
/p>
to 매개변수는 브로드캐스트 또는 멀티캐스트 주소를 포함하여 소켓 주소 계열의 유효한 주소일 수 있습니다. 브로드캐스트 주소로 보내려면 애플리케이션이 SO_BROADCAST를 활성화한 상태에서 setockopt를 사용해야 합니다. 그렇지 않으면 sendto가 실패합니다. 오류 코드 WSAEACCES가 있는 경우 TCP/IP의 경우 응용 프로그램은 그룹 구성원이 되지 않고도 모든 멀티캐스트 주소로 보낼 수 있습니다.
참고 소켓이 열리면 setockopt 호출이 이루어진 다음 sendto 호출이 이루어지면 Windows 소켓은 암시적 바인드 함수 호출을 수행합니다.
소켓이 바인딩 해제된 경우 시스템에 의해 로컬 연결에 고유한 값이 할당되고 소켓은 바인딩된 것으로 표시됩니다. 이 경우 애플리케이션은 getsockname을 사용하여 로컬 소켓 이름을 확인할 수 있습니다.
sendto가 성공적으로 완료되었다고 해서 데이터가 성공적으로 전달되었다는 의미는 아닙니다.
sendto 함수는 일반적으로 연결 없는 소켓에서 to 매개변수로 식별된 특정 피어 소켓에 데이터그램을 보내는 데 사용됩니다. 연결 없는 소켓이 이전에 특정 주소에 연결된 경우에도 to 매개변수는 해당 특정 데이터그램에 대해서만 대상 주소를 재정의합니다. 지향 소켓에서는 to 및 tolen 매개변수가 무시되어 sendto가 send와 동일해집니다.
이에 대한 자세한 설명이 있는 MSDN을 확인할 수 있습니다.