Есть три программы: сервер, клиент 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; }
|
|