2010-03-21 3 views
0

두통을 유발하는 가장 이상한 문제가 있습니다. 다음 코드를 고려하십시오winsock2에서 C++로 소켓을 생성 할 때 문제가 발생했습니다.

// Create and bind socket 
std::map<Connection, bool> clients; 
unsigned short port=6222; 
struct sockaddr_in local_address, from_address; 
int result; 
char buffer[10000]; 
SOCKET receive_socket; 
local_address.sin_family = AF_INET; 
local_address.sin_addr.s_addr = INADDR_ANY; 
local_address.sin_port = htons(port); 
receive_socket = socket(AF_INET,SOCK_DGRAM,0); 

무엇 일어나는 것은 receive_socket 내가 SOCKET_ERROR를 얻을 구속력이다. 내가 프로그램을 디버그하고 receive_socket을 체크하면, 그냥 깨진 쓰레기처럼 보인다. 나는 'std :: map'줄에 중단 점을 넣었다. 위 코드의 각 줄에 들어가면 디버그 커서가 '부호없는 짧은 포트'줄에서 첫 번째 'local_address.sin'줄로 바로 이동합니다. (F11)로 단계를 사용하고 있어도 멈추지 않습니다. struct, int, char 또는 SOCKET 선을 넘으면 직선으로 점프합니다.

이 시점에서 나는 local_address, from_address, result, buffer 및 receive_socket에 마우스를 올려 놓습니다. 그들은 모두 깨진 쓰레기로 가득 차 있습니다. 아직이 변수들을 정의하지 않았기 때문입니까? 또한 위 코드의 맨 아래에 도달하면 local_address.sin_port가 19992로 설정되었지만 6222 여야합니다.

편집 :

if(bind(receive_socket, (SOCKADDR*) &local_address, sizeof(local_address)) == SOCKET_ERROR) 
    { 
     closesocket(receive_socket); 
     return 1; 
    } 
+0

어떤 명령으로도 변환되지 않으므로이 줄로 점프합니다. –

답변

0

은 MSDN에 따르면 SOCK_STREAM

SOCK_DGRAM을 변경해보십시오,

SOCK_STREAM - A : 여기가 문에 해당하는 경우 때문에 실패 내 바인딩 코드입니다 OOB 데이터 전송 메커니즘을 사용하여 순차적이고 신뢰할 수있는 양방향 연결 기반 바이트 스트림을 제공하는 소켓 유형입니다. 이 소켓 유형은 인터넷 주소 패밀리 (AF_INET 또는 AF_INET6)에 대해 TCP (전송 제어 프로토콜)를 사용합니다.

SOCK_DGRAM - 데이터 그램을 지원하는 소켓 유형으로, 고정 길이 (일반적으로 작은)의 비 연결적이고 신뢰할 수없는 버퍼입니다. 이 소켓 유형은 인터넷 주소 패밀리 (AF_INET 또는 AF_INET6)에 대해 사용자 데이터 그램 프로토콜 (UDP)을 사용합니다.

그리고 지금까지 포트가 간다 ...

local_address.sin_port는 19992로 설정되어 있지만, 6222을해야 하는가?

htons 바이트 순서를 네트워크 호스트 바이트 순서 포트 번호 (here 참조)

+0

htons에 대한 이해가 좋습니다. 나는 SOCK_DGRAM을 SOCK_STREAM으로 바꾼 제안을 시도했지만 여전히 바인딩되지는 않습니다.여기 내 바인딩 코드는 다음과 같습니다 경우 (바인드 (receive_socket, (SOCKADDR *) & local_address,는 sizeof (local_address)) == SOCKET_ERROR) \t { \t \t closesocket 함수 (receive_socket); \t \t return 1; \t} – Ash85

+0

또한 UDP를 사용해야하므로 SOCK_DGRAM입니다. – Ash85

+0

Ah. 그 부분을 잊어 버려라 :) 나는 당신이 어쨌든 그것을 알아 낸 것을 보았다. –

0
local_address.sin_port = htons(port); 

I가 오히려 이상 발견 변환한다. 또한 왜 htons() 포트? 그건 말이 안돼. getaddrinfo() 또는 이와 유사한 것을 사용할 수 없습니까? 아니면 winsock이 수동으로 정보를 입력해야합니까?

1

나는 대답을 알아 냈다! 문제는 내 프로그램에서 WSAStartup을 어디에도 호출하지 않는 것이 었습니다. 시작 부분에 다음 코드를 고정 :

WSADATA wsaData; 
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
    { 
     return 1; 
    } 

내가 WSAGetLastError에서 오류 번호()를 받고 MSDN에 그것을보고이를 발견했다.

관련 문제