charllychilly
July 15th, 2005, 09:45 AM
Hi I am actually programming an adhoc network in Visual C++ without success. please can anyone suggest what I can do or what I am doing wrong. this is my code.
#include <stdio.h>
#include <winsock.h>
#include <iostream.h>
#define ATTACH 100
#define DETACH 200
#define ECHO 300
#define TIME 400
const UINT SRV_UDP_PORT = 5050;
CSrvrView::CSrvrView()
{
m_hListenerThread = NULL;
int status;
WSADATA wsaData;
m_data = "Initiallizing Windows Sockets DLL..."
if((status = WSAStartup(MAKEWORD(2,2), &wsaData)) == 0)
{
m_data += "Succeeded\n";
m_bInitialized = TRUE;
}
else
{
m_bInitialized = FALSE;
}
m_data += "Creating socket...";
//create socket
m_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (m_sock == INVALID_SOCKET)
{
m_data += "Failed\n";
}
//Bind socket to address
m_data =+ "Succeeded\nBinding socket..."
// set up address structure
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(INADDR_ANY);
sa.sin_port = htons(SRV_UDP_PORT);
if(bind(m_sock,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
{
m_data += "Failed\n";
closesocket(m_sock);
}
m_data += "Succeeded\nCreating listener thread...";
unsigned long idThread;
m_hListenerThread = CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)Listener,
(void *)this, 0, &idThread);
if(m_hListenerThread)
m_data += "Succeeded\nListening...\n";
else
m_data += "Failed\n";
}
//cleanup
CSrvrView::~CSrvrView()
{
if(m_bInitialized)
WSACleanup();
closesocket(m_sock);
if(m_hListenerThread)
::TerminateThread(m_hListenerThread, 0);
// define threads that recienves and process messages
long WINAPI Listener(CSrvrView* pView)
{
SOCKADDR_IN saClnt;
char msg[MSGSIZE];
int saClntLen, nchar, msglen;
while(1)
{
saClntLen = sizeof(saClnt);
nchar = recvfrom(pView->m_sock, msg, MSGSIZE, 0
(PSOCKADDR)&saClnt, &saClntLen);
if(nchar < 0)
{
pView->m_data += "Error in recvfrom\n";
pView->InvalidateRect(NULL);
}
else
{
msglen = nchar;
short *p_code = (short*)msg;
short code = ntohs(*p_code);
switch(code)
{
case ATTACH:
wsprintf(msg, "Client from %s attached\n",
inet_ntoa(saClnt.sin_addr));
msglen = strlen(msg);
pView->m_data += msg;
pView->InvalidateRect(NULL);
break;
case DETACH:
wsprintf(msg, "Client from %s detached\n",
inet_ntoa(saClnt.sin_addr));
msglen = strlen(msg);
pView->m_data += msg;
pView->InvalidateRect(NULL);
break;
case TIME:
time_t tnow;
time(&tnow);
sprintf(msg, "Time now: %s\n", ctime(&tnow));
msglen = strlen(msg);
break;
case ECHO:
saClntLen = sizeof(saClnt);
msglen = recvfrom(pView->m_sock, msg, MSGSIZE,
0, (PSOCKADDR)&saClnt, &saClntLen);
break;
default:
wsprintf(msg,
"Don't understand message: %d\n",
code);
msglen = strlen(msg);
}
}
//send result to client
sendto(pView->m_sock, msg, msglen, 0, (PSOCKADDR)&saClnt, saClntLen);
}
return(0);
}
it is not even working.
#include <stdio.h>
#include <winsock.h>
#include <iostream.h>
#define ATTACH 100
#define DETACH 200
#define ECHO 300
#define TIME 400
const UINT SRV_UDP_PORT = 5050;
CSrvrView::CSrvrView()
{
m_hListenerThread = NULL;
int status;
WSADATA wsaData;
m_data = "Initiallizing Windows Sockets DLL..."
if((status = WSAStartup(MAKEWORD(2,2), &wsaData)) == 0)
{
m_data += "Succeeded\n";
m_bInitialized = TRUE;
}
else
{
m_bInitialized = FALSE;
}
m_data += "Creating socket...";
//create socket
m_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (m_sock == INVALID_SOCKET)
{
m_data += "Failed\n";
}
//Bind socket to address
m_data =+ "Succeeded\nBinding socket..."
// set up address structure
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(INADDR_ANY);
sa.sin_port = htons(SRV_UDP_PORT);
if(bind(m_sock,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
{
m_data += "Failed\n";
closesocket(m_sock);
}
m_data += "Succeeded\nCreating listener thread...";
unsigned long idThread;
m_hListenerThread = CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)Listener,
(void *)this, 0, &idThread);
if(m_hListenerThread)
m_data += "Succeeded\nListening...\n";
else
m_data += "Failed\n";
}
//cleanup
CSrvrView::~CSrvrView()
{
if(m_bInitialized)
WSACleanup();
closesocket(m_sock);
if(m_hListenerThread)
::TerminateThread(m_hListenerThread, 0);
// define threads that recienves and process messages
long WINAPI Listener(CSrvrView* pView)
{
SOCKADDR_IN saClnt;
char msg[MSGSIZE];
int saClntLen, nchar, msglen;
while(1)
{
saClntLen = sizeof(saClnt);
nchar = recvfrom(pView->m_sock, msg, MSGSIZE, 0
(PSOCKADDR)&saClnt, &saClntLen);
if(nchar < 0)
{
pView->m_data += "Error in recvfrom\n";
pView->InvalidateRect(NULL);
}
else
{
msglen = nchar;
short *p_code = (short*)msg;
short code = ntohs(*p_code);
switch(code)
{
case ATTACH:
wsprintf(msg, "Client from %s attached\n",
inet_ntoa(saClnt.sin_addr));
msglen = strlen(msg);
pView->m_data += msg;
pView->InvalidateRect(NULL);
break;
case DETACH:
wsprintf(msg, "Client from %s detached\n",
inet_ntoa(saClnt.sin_addr));
msglen = strlen(msg);
pView->m_data += msg;
pView->InvalidateRect(NULL);
break;
case TIME:
time_t tnow;
time(&tnow);
sprintf(msg, "Time now: %s\n", ctime(&tnow));
msglen = strlen(msg);
break;
case ECHO:
saClntLen = sizeof(saClnt);
msglen = recvfrom(pView->m_sock, msg, MSGSIZE,
0, (PSOCKADDR)&saClnt, &saClntLen);
break;
default:
wsprintf(msg,
"Don't understand message: %d\n",
code);
msglen = strlen(msg);
}
}
//send result to client
sendto(pView->m_sock, msg, msglen, 0, (PSOCKADDR)&saClnt, saClntLen);
}
return(0);
}
it is not even working.