2010-12-03 2 views
1

send 함수가 const char *를 기대한다고 말하는 것은 here입니다.winsock의 send() 함수를 사용하여 넓은 문자를 보내려면 어떻게해야합니까?

와이드 문자를 보내려면 어떻게해야합니까?

void MyClass::socksend(const wchar_t* wbuffer) { 
    int i; 
    char *buffer = (char *)malloc(MB_CUR_MAX); 
    wctomb_s(&i,buffer, MB_CUR_MAX, (wchar_t)wbuffer); 
    int buflen = strlen(buffer) + 2; 
    char sendbuf[DEFAULT_BUFLEN]; 
    strcpy_s(sendbuf,buflen,buffer); 
    sendbuf[buflen - 1] = '\n'; 
    int senderror = send(this->m_socket, sendbuf, buflen, 0); 
    // error handling, etc goes here... 

} 

이 내가 그것을가 기대하지 않는 : 나는 다음 시도했다. 소켓에 아무 것도 보내지 않는 것 같습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

0

소켓을 통해 넓은 char 문자열을 전송하는 올바른 방법이 확실하지 않으므로이 부분에서는 스스로 해결할 수 있습니다. 나는 그것이 꽤 털이 있고 뒤얽힌 것으로 나에게 설명되었다는 것을 안다. : 소켓의 다른 측면에서 wchar_t 문자열을 기대하는 경우 그와 마음에, 당신은 문자열의 길이를 얻을 수 wcslen을 사용할 수 있습니다 wbuffer 점을 당신에게 제공 할

 
int senderror = send(this->m_socket, (char *)wbuffer, wcslen(wbuffer) * sizeof(wchar_t), 0); 

도 있습니다 코드에 몇 가지 가능한 버그가 있습니다. wchar_t 문자열을 멀티 바이트로 변환해야하는 경우 wctomb_s 대신 wcstombs_s를 사용해야합니다. wctombs_s는 한 번에 한 문자 씩 변환하지만 wcstombs_s는 문자열을 변환합니다.

결과 문자열이 DEFAULT_BUFLEN보다 길면 문자열을 '\ n'으로 끝내고 DEFAULT_BUFLEN 길이를 초과하는 데이터는 삭제합니다.

send이 항상 전체 버퍼를 보내는 것은 아닙니다. 모든 바이트가 전송되거나 일정 시간 내에 도달하거나 다시 시도하거나 인내 할 때까지 전송 호출을 반복해야합니다.

자세한 내용은 here을 참조하십시오.

0

처음에는 넓은 문자 란 무엇입니까? 이것은 8 비트보다 더 큰 정수 값입니다. 즉, 엔딩을 처리해야합니다. 와이드 문자 배열을 char 배열로 인코딩 한 다음 char 배열로 보내야합니다. 수신 측에서는 문자 배열을 와이드 문자 배열로 디코딩해야합니다.

기능 만 wctomb_s 단일 와이드 문자-문자 배열 인코딩한다. 과이드 문자 배열 ~ 문자 배열을 인코딩하려는 함수는 wcstombs_s입니다. 그에 상응하여 디코딩하려면 mbstowcs_s를 사용하십시오. 에러 핸들링

는 (안된) ommitted :

void MyClass::socksend(const wchar_t* wbuffer) { 
    // determine the required buffer size 
    size_t buffer_size; 
    wcstombs_s(&buffer_size, NULL, 0, wbuffer, _TRUNCATE); 

    // do the actual conversion 
    char *buffer = (char*) malloc(buffer_size); 
    wcstombs_s(&buffer_size, buffer, buffer_size, wbuffer, _TRUNCATE); 

    // send the data 
    size_t buffer_sent = 0; 
    while (buffer_sent < buffer_size) { 
     int sent_size = send(this->m_socket, buffer+buffer_sent, buffer_size-buffer_sent, 0); 
     buffer_sent += sent_size; 
    } 

    // cleanup 
    free(buffer); 
} 
관련 문제