Coding Voice Chat Application
Project
only
the coding...report will reach
soon__________________________________________
////////////////////////////UNDER
DEVELOPMENT/////////////////////////////////////////////////
////////////Supporting voice as well as text chatting
/////////////////////////////header
files//////////////////////////////////////////////////////
# include <windows.h>
# include "resource.h"
# include <process.h>
# include <stdio.h>
/////////////////////////////Macros////////////////////////////////////////////////////////////
#define BUFFER_SIZE 10000
#define SAMPLERATE 40025
#define APP_PORT1 214
#define APP_PORT2 428
#define WM_SOCKETREAD1 (WM_APP + 100)
#define WM_SOCKETREAD2 (WM_APP + 101)
//////////////////////////////////////////////////////////////////////////////////////////////
///////////State which will be send by client after every one second
static char USERSTATE[12]="IAMIN**IDLE";
SOCKADDR_IN saServer1,remote1,saServer2,remote2;
SOCKET ssock1,csock1,ssock2,csock2;
char CURRENTADDR[15]="192.168.0.255";
int threadclose=0;
HINSTANCE hins;
////////these are four thread
function////////////////////////////////////////////////////////
void recordthread(void *);
void playthread(void *);
void sendsignal(void *);
void receivesignal(void *);
//////////////////////////////////////////////////////////////////////////////////////////////
/*
csock1- the client socket involved in chatting
csock2- the client socket sending its state repeatedly
ssock1- the server socket involved in chatting
ssock2- the server socket getting state info send by csock2
*/
/////////////////////////////////////Global
variables//////////////////////////////////////////
char userlist[20][15];//array maintaining list of users
int index=0; //index of last item in list
char selfaddress[15];
char hostname[10];
HWND hwnd,hDlg1;
PBYTE gRecordBuffer,gPlayBuffer;
//int flag=0;
//////////////////////////////////////Dialog
procedures////////////////////////////////////////
void SetCurrentIP()
{
int nRetCode = gethostname ( CURRENTADDR, 256 ) ;
if ( nRetCode != 0)
{
MessageBox (0,"Host name not available","VCA
Application",MB_OK) ;
return ;
}
hostent FAR *lpHostEnt = gethostbyname ( CURRENTADDR ) ;
if ( lpHostEnt == NULL )
{
MessageBox (0,"IPAddress not available","VCA Application",MB_OK);
return;
}
LPSTR lpAddr = lpHostEnt -> h_addr_list[0] ;
if ( lpAddr )
{
in_addr inAddr ;
memmove ( &inAddr, lpAddr, 4 );
char *chIP;
chIP = inet_ntoa (inAddr) ;
strcpy(CURRENTADDR,chIP);
if(strlen(CURRENTADDR)==0)
{
MessageBox (0,"IPAddress not available","VCA
Application",MB_OK);
}
}
}
BOOL CALLBACK DialogProc(HWND hDlg, UINT MSG, WPARAM wParam, LPARAM
lParam)
{
///////////////Used In Recording and
playing/////////////////////////////////////////////////////////////
static int flag=0;
static HWAVEIN hWaveIn;
static HWAVEOUT hWaveOut;
static PBYTE
pBuffer1,pBuffer2,pBuffer3,pBuffer4,pBuffer5,pBuffer6;
static PWAVEHDR
pWaveHdr1,pWaveHdr2,pWaveHdr3,pWaveHdr4,pWaveHdr5,pWaveHdr6;
static WAVEFORMATEX waveform,waveform1;
///////////////////Used In Text
Chatting//////////////////////////////////////////////////////
static HWND listhwnd,hwndstatic,hwndmessage,hwndcheck;
//handle to list box containing list of users
static HDC hdc,hdclist,hdcblink;
static HBRUSH hbrushstatic;
static HICON hicon;
static char *str;
static int pos,xm,ym;
static char name[]={'C','H','A','T','T','I','N','G'};
hDlg1=hDlg;
/////////////////////////////////////////////////////////////////////////
switch(MSG)
{
case WM_INITDIALOG:
{
//set current ip address
SetCurrentIP();
///////////////////Initializing Headers and
buffers///////////////
pWaveHdr1=(PWAVEHDR)malloc(sizeof(WAVEHDR));
pWaveHdr2=(PWAVEHDR)malloc(sizeof(WAVEHDR));
pWaveHdr3=(PWAVEHDR)malloc(sizeof(WAVEHDR));
pWaveHdr4=(PWAVEHDR)malloc(sizeof(WAVEHDR));
pWaveHdr5=(PWAVEHDR)malloc(sizeof(WAVEHDR));
pWaveHdr6=(PWAVEHDR)malloc(sizeof(WAVEHDR));
MessageBox(NULL,"Start Recording ?","Record Info",0);
gRecordBuffer=(PBYTE)malloc(BUFFER_SIZE);
gPlayBuffer=(PBYTE)malloc(BUFFER_SIZE);
pBuffer1=(PBYTE)malloc(BUFFER_SIZE);
pBuffer2=(PBYTE)malloc(BUFFER_SIZE);
pBuffer3=(PBYTE)malloc(BUFFER_SIZE);
pBuffer4=(PBYTE)malloc(BUFFER_SIZE);
pBuffer5=(PBYTE)malloc(BUFFER_SIZE);
pBuffer6=(PBYTE)malloc(BUFFER_SIZE);
if(!pBuffer1 || !pBuffer2 || !pBuffer3 ||
!pBuffer4 || !pBuffer5 || !pBuffer6)
{
if(pBuffer1)
free (pBuffer1);
if(pBuffer2)
free (pBuffer2);
if(pBuffer3)
free (pBuffer3);
if(pBuffer4)
free (pBuffer4);
if(pBuffer5)
free (pBuffer5);
if(pBuffer6)
free (pBuffer6);
MessageBeep(MB_ICONEXCLAMATION);
MessageBox(hwnd,"Error in allocating
memmory","Error info",0);
return TRUE;
}
//open waveform fir input
//defines the format of waveform-audio data
waveform.wFormatTag =WAVE_FORMAT_PCM;
//Waveform-audio format type
waveform.nChannels =1;//Number of channels in the
waveform-audio data
waveform.nSamplesPerSec =SAMPLERATE;//Sample
rate, in samples per second (hertz),
waveform.nAvgBytesPerSec =SAMPLERATE;//Required
average data-transfer rate
waveform.nBlockAlign =1;
waveform.wBitsPerSample =16;//sample size 8 or 16
waveform.cbSize =0;//extra format information
waveform1.wFormatTag =WAVE_FORMAT_PCM;
//Waveform-audio format type
waveform1.nChannels =1;//Number of channels in the
waveform-audio data
waveform1.nSamplesPerSec =SAMPLERATE;//Sample
rate, in samples per second (hertz),
waveform1.nAvgBytesPerSec
=SAMPLERATE;//Required average data-transfer rate
waveform1.nBlockAlign =1;
waveform1.wBitsPerSample =16;//sample size 8 or 16
waveform1.cbSize =0;//extra format information
/*
if(waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)hDlg,0,CALLBACK_
WINDOW))
{
free(pBuffer1);
free(pBuffer2);
free(pBuffer3);
MessageBox(hwnd,"can't open for
input","WARNING",MB_OK);
}*/
pWaveHdr4->lpData =(LPSTR)pBuffer4;
pWaveHdr4->dwBufferLength =BUFFER_SIZE;
pWaveHdr4->dwBytesRecorded =0;
pWaveHdr4->dwUser =0;
pWaveHdr4->dwFlags =0;
pWaveHdr4->dwLoops =0;
pWaveHdr4->lpNext =NULL;
pWaveHdr4->reserved =0;
waveOutPrepareHeader(hWaveOut,pWaveHdr4,sizeof(WAVEHDR));
pWaveHdr5->lpData =(LPSTR)pBuffer5;
pWaveHdr5->dwBufferLength =BUFFER_SIZE;
pWaveHdr5->dwBytesRecorded =0;
pWaveHdr5->dwUser =0;
pWaveHdr5->dwFlags =0;
pWaveHdr5->dwLoops =0;
pWaveHdr5->lpNext =NULL;
pWaveHdr5->reserved =0;
waveOutPrepareHeader(hWaveOut,pWaveHdr5,sizeof(WAVEHDR));
pWaveHdr6->lpData =(LPSTR)pBuffer6;
pWaveHdr6->dwBufferLength =BUFFER_SIZE;
pWaveHdr6->dwBytesRecorded =0;
pWaveHdr6->dwUser =0;
pWaveHdr6->dwFlags =0;
pWaveHdr6->dwLoops =0;
pWaveHdr6->lpNext =NULL;
pWaveHdr6->reserved =0;
waveOutPrepareHeader(hWaveOut,pWaveHdr6,sizeof(WAVEHDR));
//waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform1,(DWORD)hwnd,0,CALLBACK_
WINDOW);
pWaveHdr1->lpData =(LPSTR)pBuffer1;
pWaveHdr1->dwBufferLength =BUFFER_SIZE;
pWaveHdr1->dwBytesRecorded =0;
pWaveHdr1->dwUser =0;
pWaveHdr1->dwFlags =0;
pWaveHdr1->dwLoops =0;
pWaveHdr1->lpNext =NULL;
pWaveHdr1->reserved =0;
waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
pWaveHdr2->lpData =(LPSTR)pBuffer2;
pWaveHdr2->dwBufferLength =BUFFER_SIZE;
pWaveHdr2->dwBytesRecorded =0;
pWaveHdr2->dwUser =0;
pWaveHdr2->dwFlags =0;
pWaveHdr2->dwLoops =0;
pWaveHdr2->lpNext =NULL;
pWaveHdr2->reserved =0;
waveInPrepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));
pWaveHdr3->lpData =(LPSTR)pBuffer3;
pWaveHdr3->dwBufferLength =BUFFER_SIZE;
pWaveHdr3->dwBytesRecorded =0;
pWaveHdr3->dwUser =0;
pWaveHdr3->dwFlags =0;
pWaveHdr3->dwLoops =0;
pWaveHdr3->lpNext =NULL;
pWaveHdr3->reserved =0;
waveInPrepareHeader(hWaveIn,pWaveHdr3,sizeof(WAVEHDR));
//////////////////////brush
intialization///////////////////
hbrushstatic=CreateSolidBrush(RGB(150,90,250));
//notify whenever a socket event occur by
sending specified message
WSAAsyncSelect(ssock1, hDlg, WM_SOCKETREAD1, FD_READ);
WSAAsyncSelect(ssock2, hDlg, WM_SOCKETREAD2, FD_READ);
hwnd=GetDlgItem(hDlg,IDC_TEXT);
hwndstatic=GetDlgItem(hDlg,IDC_TITLE);
str=(char *)calloc(8,sizeof(char));
SendMessage(hwnd,BM_SETCHECK,1,0);
hwnd=GetDlgItem(hDlg,IDC_BROADCAST);
SendMessage(hwnd,BM_SETCHECK,1,0);
listhwnd=GetDlgItem(hDlg,IDC_USERLIST);
hwnd=GetDlgItem(hDlg,IDC_USERLIST);
EnableWindow(hwnd,FALSE);
hwnd=GetDlgItem(hDlg,IDC_CURRENT);
EnableWindow(hwnd,FALSE);
gethostname(hostname,10);
sendto(csock2,hostname,strlen(hostname), 0,
(SOCKADDR *)&remote2, sizeof(SOCKADDR));
//Broadcasting on network that new process has started
sendto(csock2,"NEWCL**IN",strlen("NEWCL**IN"),
0, (SOCKADDR *)&remote2, sizeof(SOCKADDR));
SetClassLong(listhwnd,GCL_HBRBACKGROUND,RGB(56,111,120));
//starting timer to send state's info
hicon=LoadIcon(hins,MAKEINTRESOURCE(IDI_ICON1));
SetClassLong(hDlg,GCL_HICON,(long)hicon);
SetTimer(hDlg,1,1000,NULL);
SetTimer(hDlg,2,100,NULL);
}
break;
////////////////////////////////////////////////////////////////////////////////////////
case MM_WIM_OPEN:
MessageBox(hwnd,"Input Device is
opened","Device info",0);
waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn,pWaveHdr3,sizeof(WAVEHDR));
waveInStart(hWaveIn);
MessageBox(hwnd,"Recording
Started","Recording Info",0);
return TRUE;
case MM_WOM_OPEN:
//MessageBox(NULL,"Output Device is
opened","Recording Info",0);
waveOutPrepareHeader(hWaveOut,pWaveHdr4,sizeof(WAVEHDR));
waveOutWrite(hWaveOut,pWaveHdr4,sizeof(WAVEHDR));
waveOutPrepareHeader(hWaveOut,pWaveHdr5,sizeof(WAVEHDR));
waveOutWrite(hWaveOut,pWaveHdr5,sizeof(WAVEHDR));
waveOutPrepareHeader(hWaveOut,pWaveHdr6,sizeof(WAVEHDR));
waveOutWrite(hWaveOut,pWaveHdr6,sizeof(WAVEHDR));
return TRUE;
case MM_WIM_DATA:
//CopyMemory(gRecordBuffer,((PWAVEHDR)lParam)->lpData,BUFFER_SIZE);
//remote1.sin_addr.s_addr = inet_addr("192.168.0.40");
sendto(csock1,((PWAVEHDR)lParam)->lpData,BUFFER_SIZE,0,(SOCKADDR
*)&remote1,sizeof(SOCKADDR));
//remote1.sin_addr.s_addr = inet_addr("192.168.0.255");
waveInAddBuffer(hWaveIn,(PWAVEHDR)lParam,sizeof(WAVEHDR));
return TRUE;
case MM_WOM_DONE:
CopyMemory(((PWAVEHDR)lParam)->lpData,gPlayBuffer,BUFFER_SIZE);
waveOutPrepareHeader(hWaveOut,((PWAVEHDR)lParam),sizeof(WAVEHDR));
waveOutWrite(hWaveOut,((PWAVEHDR)lParam),sizeof(WAVEHDR));
return TRUE;
case MM_WIM_CLOSE:
waveInUnprepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
waveInUnprepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));
waveInUnprepareHeader(hWaveIn,pWaveHdr3,sizeof(WAVEHDR));
waveInUnprepareHeader(hWaveIn,pWaveHdr4,sizeof(WAVEHDR));
waveInUnprepareHeader(hWaveIn,pWaveHdr5,sizeof(WAVEHDR));
waveInUnprepareHeader(hWaveIn,pWaveHdr6,sizeof(WAVEHDR));
free(pBuffer1);
free(pBuffer2);
free(pBuffer3);
free(pBuffer4);
free(pBuffer5);
free(pBuffer6);
return TRUE;
///////////////////////////////////////////////////////////////////////////
case WM_CTLCOLORSTATIC:
SetTextColor(HDC(wParam),RGB(255,255,255));
SetBkMode((HDC)wParam,TRANSPARENT);
if(hwndstatic==(HWND)lParam)
{
TextOut((HDC)wParam,200,0,"hello",5);
}
return (LRESULT)hbrushstatic;
break;
case WM_CTLCOLORLISTBOX:
if(listhwnd==(HWND)lParam)
{
SetTextColor(HDC(wParam),RGB(128,0,0));
SetBkMode((HDC)wParam,TRANSPARENT);
}
else
{
SetTextColor(HDC(wParam),RGB(0,0,0));
SetBkMode((HDC)wParam,TRANSPARENT);
}
return (LRESULT)CreateSolidBrush(RGB(255,240,200));
break;
case WM_CTLCOLORBTN:
{
SetTextColor(HDC(wParam),RGB(255,255,255));
SetBkMode((HDC)wParam,TRANSPARENT);
return (LRESULT)CreateSolidBrush(RGB(255,240,200));
}
break;
case WM_PAINT:
RECT rt;
HBRUSH hbrush;
hbrush=CreateSolidBrush(RGB(150,90,250));
GetClientRect(hDlg,&rt);
hdc=GetDC(hDlg);
SelectObject(hdc,hbrush);
FillRect(hdc,&rt,hbrush);
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(0,255,0));
ReleaseDC(hDlg,hdc);
hdc=GetDC(hwndstatic);
TextOut(hdc,200,0,"hello",5);
ReleaseDC(hwndstatic,hdc);
break;
case WM_CLOSE:
EndDialog(hDlg,0);
break;
case WM_COMMAND:
{
switch(wParam)
{
case IDC_VOICE:
/*if(waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)hDlg,0,CALLBACK_WINDOW))
{
free(pBuffer1);
free(pBuffer2);
free(pBuffer3);
MessageBox(hwnd,"can't open for
input","WARNING",MB_OK);
}*/
hwnd=GetDlgItem(hDlg,IDC_MESSAGE_RECEIVE);
EnableWindow(hwnd,FALSE);
hwnd=GetDlgItem(hDlg,IDC_MESSAGE_SEND);
EnableWindow(hwnd,FALSE);
hwnd=GetDlgItem(hDlg,IDC_SEND);
EnableWindow(hwnd,FALSE);
return TRUE;
case IDC_TEXT:
hwnd=GetDlgItem(hDlg,IDC_MESSAGE_RECEIVE);
EnableWindow(hwnd,TRUE);
hwnd=GetDlgItem(hDlg,IDC_MESSAGE_SEND);
EnableWindow(hwnd,TRUE);
hwnd=GetDlgItem(hDlg,IDC_SEND);
EnableWindow(hwnd,TRUE);
return TRUE;
case IDC_BROADCAST:
strcpy(CURRENTADDR,"192.168.0.255");
hwnd=GetDlgItem(hDlg,IDC_USERLIST);
EnableWindow(hwnd,FALSE);
hwnd=GetDlgItem(hDlg,IDC_CURRENT);
EnableWindow(hwnd,FALSE);
//MessageBox(NULL,"dfsdfsF","asfadsa",0);
return TRUE;
case IDC_PERSONAL:
{
SendMessage(listhwnd,LB_SETCURSEL,0,0);
int idx=SendMessage(listhwnd,LB_GETCURSEL,0,0);
SendMessage(listhwnd,LB_GETTEXT,idx,(LPARAM)CURRENTADDR);
remote1.sin_addr.s_addr = inet_addr(CURRENTADDR);
hwnd=GetDlgItem(hDlg,IDC_USERLIST);
EnableWindow(hwnd,TRUE);
hwnd=GetDlgItem(hDlg,IDC_CURRENT);
EnableWindow(hwnd,TRUE);
if(strcmp(CURRENTADDR,"192.168.0.255")!=0&&strcmp(CURRENTADDR,"")!=0)
SetDlgItemText(hDlg,IDC_CURRENT,CURRENTADDR);
return TRUE;
}
case IDC_SEND:
{
char str[15];
GetDlgItemText(hDlg,IDC_CURRENT,str,15);
hwnd=GetDlgItem(hDlg,IDC_PERSONAL);
int
icheck1=SendMessage(hwnd,BM_GETCHECK,0,0);
if(strcmp(str,"")==0 && icheck1)
{
MessageBox(NULL,"Please
connect before sending","WARNING",0);
return TRUE;
}
char buffer[256];
//getting the text to be send
GetDlgItemText(hDlg,
IDC_MESSAGE_SEND, buffer, 256);
hwnd=GetDlgItem(hDlg,IDC_MESSAGE_RECEIVE);
if(SendMessage(hwnd,LB_GETCOUNT,0,0)==15)
SendMessage(hwnd,LB_DELETESTRING,0,0);
SendMessage(hwnd,LB_ADDSTRING,0,(LPARAM)buffer);
int len = sizeof(SOCKADDR);
//sending to socket ssock1
sendto(csock1, buffer,
strlen(buffer), 0, (SOCKADDR *)&remote1, sizeof(SOCKADDR));
}
break;
case IDC_CONNECT:
{
threadclose=1;
//getting the selected ipaddress
int idx=SendMessage(listhwnd,LB_GETCURSEL,0,0);
SendMessage(listhwnd,LB_GETTEXT,idx,(LPARAM)CURRENTADDR);
SetDlgItemText(hDlg,IDC_CURRENT,CURRENTADDR);
//setting the ip address to the selected
address from the list
remote1.sin_addr.s_addr = inet_addr(CURRENTADDR);
strcpy(USERSTATE,"IAMIN**BUSY");
InvalidateRect(listhwnd,NULL,FALSE);
hwnd=GetDlgItem(hDlg,IDC_TEXT);
int icheck=SendMessage(hwnd,BM_GETCHECK,0,0);
hwnd=GetDlgItem(hDlg,IDC_BROADCAST);
int icheck1=SendMessage(hwnd,BM_GETCHECK,0,0);
if(icheck==0&&icheck1==0)
{
_beginthread(recordthread,0,NULL);
}
break;
}
case IDC_CLOSECONNECTION:
strcpy(USERSTATE,"IAMIN**IDLE");
//resetting the ipaddress to broadcast address
SetDlgItemText(hDlg,IDC_CURRENT,"");
remote1.sin_addr.s_addr inet_addr("192.168.0.255");
break;
case IDC_CANCEL:
//ReleaseDC(listhwnd,hdc);
//broadcasting of its exit so that
others canupdate their list
sendto(csock2,"NEWCL**OUT",strlen("NEWCL**OUT"), 0, (SOCKADDR
*)&remote2, sizeof(SOCKADDR));
KillTimer(hDlg,1);
//KillTimer(hwndstatic,2);
EndDialog(hDlg, 0);
break;
}
}
break;
case WM_TIMER:
//broadcasting its state
switch(wParam)
{
case 1:
sendto(csock2,USERSTATE,strlen(USERSTATE), 0, (SOCKADDR *)&remote2,
sizeof(SOCKADDR));
break;
case 2:
//InvalidateRect(hwndstatic,NULL,TRUE);
strcpy(str,"");
for(int j=0;j<=pos;j++)
sprintf(str,"%s%c",str,name[j]);
hdcblink=GetWindowDC(hDlg);
SetWindowText(hDlg,str);
ReleaseDC(hwnd,hdcblink);
pos++;
if(pos>7)
pos=pos*0;
xm++;
ym++;
break;
}
break;
case WM_SOCKETREAD1:
{
char ipaddress[15];
hwndcheck=GetDlgItem(hDlg,IDC_VOICE);
int icheck=SendMessage(hwndcheck,BM_GETCHECK,0,0);
if(icheck==0)
{
SOCKADDR_IN from;
char buffer[256];
int len = sizeof(SOCKADDR);
memset(buffer, '\0', 256);
//Receaving from csock1
recvfrom(ssock1, buffer, 256,
0,(SOCKADDR*)&from, &len);
strcpy(ipaddress,inet_ntoa(from.sin_addr));
//setting the text to selected
//SetDlgItemText(hDlg,
IDC_MESSAGE_RECEIVE, buffer);
//MessageBox(NULL,selfaddress,"",0);
if(strcmp(ipaddress,selfaddress)!=0)
{
hwnd=GetDlgItem(hDlg,IDC_MESSAGE_RECEIVE);
if(SendMessage(hwnd,LB_GETCOUNT,0,0)==15)
SendMessage(hwnd,LB_DELETESTRING,0,0);
SendMessage(hwnd,LB_ADDSTRING,0,(LPARAM)buffer);
}
}
else
{
SOCKADDR from;
char * pBuffer;
pBuffer=(char*)malloc(BUFFER_SIZE);
int len = sizeof(SOCKADDR);
int
size=recvfrom(ssock1,pBuffer,BUFFER_SIZE,0,&from,&len);
CopyMemory(gPlayBuffer,pBuffer,BUFFER_SIZE);
if(flag==0)
{
CopyMemory(pBuffer4,gPlayBuffer,BUFFER_SIZE);
//MessageBox(NULL,"Flag
is 0","In Receive",0);
}
if(flag==1)
CopyMemory(pBuffer5,gPlayBuffer,BUFFER_SIZE);
if(flag==2)
{
CopyMemory(pBuffer6,gPlayBuffer,BUFFER_SIZE);
waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform1,(DWORD)hDlg,0,CALLBACK_
WINDOW);
//MessageBox(NULL,"Opened for output","Out Info",0);
}
flag++;
free(pBuffer);
//for receiving voice signals
//run thread for receiving voice sinal
//_beginthread(playthread,0,NULL);
}
}
break;
case WM_SOCKETREAD2:
{
SOCKADDR_IN from;
char ipaddress[15];
char buffer[256];
int len = sizeof(SOCKADDR);
memset(buffer, '\0', 256);
//receaving state's info
recvfrom(ssock2, buffer, 256, 0,(SOCKADDR*)&from, &len);
strcpy(ipaddress,inet_ntoa(from.sin_addr));
if(strcmp("IAMIN**BUSY",buffer)==0)
{
//sendto(csock2,USERSTATE,strlen(USERSTATE), 0, (SOCKADDR *)&remote2,
sizeof(SOCKADDR));
}
else if(strcmp("IAMIN**IDLE",buffer)==0)
{
//strcmp(USERSTATE,"IAMIN**BUSY");
}
//if a new user is in
else if(strcmp("NEWCL**IN",buffer)==0)
{
//checking if the message is from the machine itself
if(strcmp(ipaddress,selfaddress)!=0)
{
//updating its list
SendMessage(listhwnd,LB_ADDSTRING,0,(LPARAM)ipaddress);
//Replying back with its state
remote2.sin_addr.s_addr inet_addr(ipaddress);
sendto(csock2,"NEWCL**OK",strlen("NEWCL**OK"), 0, (SOCKADDR
*)&remote2, sizeof(SOCKADDR));
//setting the ipaddress to
broadcast address
remote2.sin_addr.s_addr
inet_addr("192.168.0.255");
}
}
else if(strcmp("NEWCL**OUT",buffer)==0)
{
for(int
i=0;i<SendMessage(listhwnd,LB_GETCOUNT,0,0);i++)
{
char ch[16];
SendMessage(listhwnd,LB_GETTEXT,i,(LPARAM)ch);
if(strcmp(ch,ipaddress)==0)
{
SendMessage(listhwnd,LB_DELETESTRING,i,0);
}
}
}
else if(strcmp("NEWCL**OK",buffer)==0)
{
SendMessage(listhwnd,LB_ADDSTRING,0,(LPARAM)ipaddress);
}
else if(strcmp(hostname,buffer)==0)
{
strcpy(selfaddress,inet_ntoa(from.sin_addr));
}
}
break;
}
return(0);
}
///////////////////////////////////////WinMain
Function////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nShowCmd)
{
WSADATA data;
if (WSAStartup(MAKEWORD(2,2), &data) != 0) return(0);
int ret;
hins=hInstance;
ssock1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
ssock2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (!ssock1)
{
WSACleanup();
return(0);
}
saServer1.sin_family = AF_INET;
saServer1.sin_addr.s_addr = INADDR_ANY;
saServer1.sin_port = htons(APP_PORT1);
ret = bind(ssock1, (SOCKADDR *)&saServer1, sizeof(SOCKADDR));
saServer2.sin_family = AF_INET;
saServer2.sin_addr.s_addr = INADDR_ANY;
saServer2.sin_port = htons(APP_PORT2);
ret = bind(ssock2, (SOCKADDR *)&saServer2, sizeof(SOCKADDR));
if (ret)
{
WSACleanup();
return(false);
}
csock1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
remote1.sin_family = AF_INET;
remote1.sin_addr.s_addr = inet_addr(CURRENTADDR);
remote1.sin_port = htons(APP_PORT1);
csock2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
remote2.sin_family = AF_INET;
remote2.sin_addr.s_addr = inet_addr("192.168.0.255");
remote2.sin_port = htons(APP_PORT2);
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
closesocket(csock1);
closesocket(ssock1);
closesocket(csock2);
closesocket(ssock2);
WSACleanup();
return(1);
}
/////////////////////////////////////Function's
Declaration/////////////////////////////////////////////
void recordthread(void *args)
{
while(1)
{
//thread for recording voice
//voice of client user
hwnd=GetDlgItem(hDlg1,IDC_TEXT);
int icheck=SendMessage(hwnd,BM_GETCHECK,0,0);
if(icheck!=0||threadclose==1)
_endthread();
}
}
void playthread(void *args)
{
//thread for playing the
//signals received from socket or remote user
}
void sendsignal(void *args)
{
//thread send signals
//recording of client user
}
void receivesignal(void *args)
{
//thread receive signals from remote user
//send for playing voice
}
/////////////////////////////////////////////////////////////////////////////////////////////// |