Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Платформы Windows Mobile и Windows Embedded > взаимодействие mfc клиента WinCE и C# сервера


Автор: tavla 8.10.2010, 18:18
Есть три программы: сервер, клиент mfc и клиент mfc WinCE.
Если подключаться к серверу, формируя адрес следующим оразом
    hostByIP = inet_addr(hostStr);
    m_remoteAddress.sin_addr.s_addr = hostByIP;
    m_remoteAddress.sin_family = AF_INET;
    m_remoteAddress.sin_port = htons(remotePort);
    if(connect((unsigned int)s, (sockaddr *) &m_remoteAddress, sizeof (m_remoteAddress)) != 0)
        {…}
то connect(…) возвращает 0, подключения нет. Хотя спокойно подключается к серверу, написанному на mfc, ip адрес и порт в m_remoteAddress в обоих случаях определяются нормально.

Если формировать адрес через gethostbyname
    SOCKADDR_IN sAdr;
    hostent* pHost=gethostbyname(hostStr);
    memcpy ((char FAR *)&(sAdr.sin_addr),pHost->h_addr,pHost->h_length);
    sAdr.sin_port = htons(3000);
    sAdr.sin_family = AF_INET;
    if(connect((unsigned int)s, (PSOCKADDR) &sAdr, sizeof (sAdr)) != 0)
        {…}
то клиент ПК подключается к серверу, а в WinCE функция gethostbyname() возвращает 0 и программа вылетает с ошибкой.

Почему клиент не видит сервер? 
Почему не работает gethostbyname()? 
Почему при разных способах формирования адреса результат настолько разный? 
И как это исправить, нужно взаимодействие клиента (сервера) mfc wince и сервера (клиента) c# wpf 


Сервер C#:
Код

    public class Server
    {
        private int LocalPort;
        private IPAddress LocalServer;
        private Thread ServThread;
        Socket ClientSock;
        TcpListener Listener;

        public void Create(int port)
        {
            LocalPort = port;
            ServThread = new Thread(new ThreadStart(ServStart));
            ServThread.Start();
        }

        public void Close()
        {
            Listener.Stop();
            ServThread.Abort();
            return;
        }

        private void ServStart()
        {
            string data;
            byte[] cldata = new byte[1024];
            LocalServer = IPAddress.Parse("127.0.0.1");
            Listener = new TcpListener(LocalServer, LocalPort);
            Listener.Start();
            TcpClient client;

            try
            {
                ClientSock = Listener.AcceptSocket();
                //client = Listener.AcceptTcpClient();
            }
            catch
            {
                ServThread.Abort();
                MessageBox.Show("Error Listener.AcceptSocket");
                return;
            }
            int i = 0;

            if (ClientSock.Connected)
            {
                while (true)
                {
                    try
                    {
                        i = ClientSock.Receive(cldata);
                    }
                    catch
                    {
                        MessageBox.Show("Error ClientSock.Receive");
                    }

                    try
                    {
                        if (i > 0)
                        {

                            data = Encoding.UTF8.GetString(cldata).Trim();
                            MessageBox.Show("<" + data);
                            ClientSock.Send(Encoding.UTF8.GetBytes("Your data: " + data));
                        }
                    }
                    catch
                    {
                        ClientSock.Close();
                        Listener.Stop();
                        ServThread.Abort();
                        MessageBox.Show("Error data");
                    }
                }
            }
        }



Клиент mfc:
Код

bool CCESocket::Connect(CString &addr, UINT remotePort)
{
    char hostStr[257];
    int wHostLen;
    LPTSTR wHost;
    ulong hostByIP;
    HOSTENT *hostByName;

    if(!m_bWSAStarted)
        return FALSE;

    //Gets address string and convert it from unicode to multibyte
    wHostLen = addr.GetLength();
    if(wHostLen > 256)
        wHostLen = 256;
    wHost = addr.GetBuffer(wHostLen);
#ifdef _WIN32_WCE
    wcstombs(hostStr, wHost, 256);
#else
    wHost[wHostLen] = '\0';
    strcpy(hostStr, wHost);
    addr.ReleaseBuffer();
#endif
    
    //Builds destination address
    memset(&m_remoteAddress, 0, sizeof(SOCKADDR_IN));
    
    hostByIP = inet_addr(hostStr);
    m_remoteAddress.sin_addr.s_addr = hostByIP;
    m_remoteAddress.sin_family = AF_INET;
    m_remoteAddress.sin_port = htons(remotePort);

    //SOCKADDR_IN sAdr;
    //hostent* pHost=gethostbyname(hostStr);
    //memcpy ((char FAR *)&(sAdr.sin_addr),pHost->h_addr,pHost->h_length);
    //sAdr.sin_port = htons(3000);
    //sAdr.sin_family = AF_INET;

    //Connects if TCP.
    //UDP is connectionless. However we'll use m_remoteAddress for sending data.
    if(m_socketType == SOCK_STREAM)
    {
        //if(connect((unsigned int)s, (PSOCKADDR) &sAdr, sizeof (sAdr)) != 0)
        if(connect((unsigned int)s, (sockaddr *) &m_remoteAddress, sizeof (m_remoteAddress)) != 0)

        {
            m_errorCode = WSAGetLastError();
            return FALSE;
        }
        m_socketState = CONNECTED;

        //TCP: Start reading thread
        //UDP: Can't start it now, we must first do a sendto to bind to a local port
        m_readThread = CreateThread(NULL, 0, StartThread, this, 0, NULL );
    }
    else
    {
        m_udpReadyToSend  = TRUE;
        m_socketState = CONNECTED;
    }

    return TRUE;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)