Unicode下,socket的Sendto/RecvFrom函數的使用

有:cstring strSend(_T("how are your!")) ;

需要用socket函數send/sendto來發送:


int len = strSend.GetLength() ;

DWORD dwIP ;
    ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP) ;
    SOCKADDR_IN addrTo;
    ZeroMemory(&addrTo, sizeof(SOCKADDR_IN)) ;
    addrTo.sin_family=AF_INET;
    addrTo.sin_port=htons(6000);
   // addrTo.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrTo.sin_addr.S_un.S_addr=htol(dwIP) ;//通過IP空件獲取IP地址

int retint = sendto(m_socket,(char*)strSend.GetBuffer(len*2),len*2+2,0,
        (SOCKADDR*)&addrTo,sizeof(SOCKADDR));//對於unicode字符類型,由於在內存中佔2個內存長度(2個char),getlength()是獲取unicode字符串中字符的長度,send/sendto對應的發送的卻是char*類型,所以發送字節長度一定爲字符串長度+1的兩倍;


    if (SOCKET_ERROR == retint)
    {
        return ;
    }
    strSend.ReleaseBuffer(len*2) ;

用recv/recvfrom來接收:

SOCKADDR_IN addrFrom;
ZeroMemory(&addrFrom, sizeof(SOCKADDR_IN)) ;
    int len=sizeof(SOCKADDR);

    TCHAR recvBuf[200];//unicode字符類型
    TCHAR tempBuf[300];
    int retval;
    while(TRUE)
    {
        retval=recvfrom(sock,(char*)recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);//recvBuf強制轉換一下就行了。
        if(SOCKET_ERROR==retval)
            break;
        wsprintf(tempBuf,_T("說: %s"),recvBuf);//用unicode對應的格式化輸出;

        ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
    }


總結:在unicode環境下編程,遇到參數爲char*的函數,或者需要在char* 與tchar之間轉換時,轉換的長度一定是
char* = 2*(1+wcslen(tchar)) ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章