[ back to toc ]

network programming in c

Date: 2002/05/21 11:04

Q:
The following program when executed in VC++ generated the error*NAME-DELETED* *NAME-DELETED*hown
below. Plea*NAME-DELETED*e *NAME-DELETED*ugge*NAME-DELETED*t the po*NAME-DELETED**NAME-DELETED*ible *NAME-DELETED*tep*NAME-DELETED* for trouble *NAME-DELETED*hooting.
Thi*NAME-DELETED* i*NAME-DELETED* a client program for UDP.
# include<window*NAME-DELETED*.h>
# include<*NAME-DELETED*tdio.h>

*NAME-DELETED*truct *NAME-DELETED*ockaddr_in *NAME-DELETED*a;
WNDCLASS a;
HWND b;
MSG c;
WSADATA w*NAME-DELETED*;
SOCKET *NAME-DELETED*;
DWORD e;
int dw;
char **NAME-DELETED*tr;
char aa[200];
char bb[100];
long _*NAME-DELETED*tdcall zzz(HWND w,UINT x,WPARAM y,LPARAM z);

void abc(char *p)
{
FILE *fp=fopen("c:\\b.txt","a+");
fprintf(fp,"%*NAME-DELETED*\n",p);
fclo*NAME-DELETED*e(fp);
}

int _*NAME-DELETED*tdcall WinMain(void *i,void *j,char *k,int l)
{
a.lp*NAME-DELETED*zCla*NAME-DELETED**NAME-DELETED*Name="guju";
a.hIn*NAME-DELETED*tance=i;
a.hbrBackground=GetStockObject(WHITE_BRUSH);
a.lpfnWndProc=zzz;
Regi*NAME-DELETED*terCla*NAME-DELETED**NAME-DELETED*(&a);
b=CreateWindow("guju","tclient",WS_OVERLAPPEDWINDOW,1,1,10,20,0,0,i,0);
ShowWindow(b,3);
while(GetMe*NAME-DELETED**NAME-DELETED*age(&c,0,0,0))
Di*NAME-DELETED*patchMe*NAME-DELETED**NAME-DELETED*age(&c);
return 1;
}

long _*NAME-DELETED*tdcall zzz(HWND w,UINT x,WPARAM y,LPARAM z)
{
if(x==WM_LBUTTONDOWN)
{
e=WSAStartup(0x0101,&w*NAME-DELETED*);
*NAME-DELETED*printf(aa,"WSASTARTUP = %ld\n",e);
abc(aa);
*NAME-DELETED*=*NAME-DELETED*ocket(PF_INET,SOCK_DGRAM,0);
*NAME-DELETED*printf(aa,"SOCKET = %ld\n",*NAME-DELETED*);
abc(aa);
*NAME-DELETED*a.*NAME-DELETED*in_family=AF_INET;
*NAME-DELETED*a.*NAME-DELETED*in_port=hton*NAME-DELETED*(13);
*NAME-DELETED*a.*NAME-DELETED*in_addr.*NAME-DELETED*_addr=inet_addr("70.0.0.3");
*NAME-DELETED*trcpy(bb,"Hello, How are you ?");
e=*NAME-DELETED*endto(*NAME-DELETED*,bb,100,0,(*NAME-DELETED*truct *NAME-DELETED*ockaddr *)&*NAME-DELETED*a,*NAME-DELETED*izeof(*NAME-DELETED*a));
abc(bb);
*NAME-DELETED*printf(aa,"Send to = %ld",e);
abc(aa);
dw = *NAME-DELETED*izeof(*NAME-DELETED*a);
recvfrom(*NAME-DELETED*,bb,100,0,(*NAME-DELETED*truct *NAME-DELETED*ockaddr *)&*NAME-DELETED*a,&dw);
*NAME-DELETED*printf(aa,"Me*NAME-DELETED**NAME-DELETED*age From Server = %*NAME-DELETED*",bb);
abc(aa);
Me*NAME-DELETED**NAME-DELETED*ageBox(0,bb,"Data From Server",0);
Me*NAME-DELETED**NAME-DELETED*ageBox(0,"Hi","Hi",0);
}
if (x==WM_DESTROY)
Po*NAME-DELETED*tQuitMe*NAME-DELETED**NAME-DELETED*age(0);
return DefWindowProc(w,x,y,z);
}
The error*NAME-DELETED* that were generated were:

D:\udpro\udpcli.cpp(26) : error C2731: 'WinMain' : function cannot be
overloaded
D:\udpro\udpcli.cpp(25) : *NAME-DELETED*ee declaration of 'WinMain'
D:\udpro\udpcli.cpp(28) : error C2440: '=' : cannot convert from 'void *'
to '*NAME-DELETED*truct HINSTANCE__ *'
Conver*NAME-DELETED*ion from 'void*' to pointer to non-'void' require*NAME-DELETED* an
explicit ca*NAME-DELETED*t
D:\udpro\udpcli.cpp(29) : error C2440: '=' : cannot convert from 'void *'
to '*NAME-DELETED*truct HBRUSH__ *'
Conver*NAME-DELETED*ion from 'void*' to pointer to non-'void' require*NAME-DELETED* an
explicit ca*NAME-DELETED*t
D:\udpro\udpcli.cpp(32) : error C2664: 'CreateWindowExA' : cannot convert
parameter 11 from 'void *' to '*NAME-DELETED*truct HINSTANCE__ *'
Conver*NAME-DELETED*ion from 'void*' to pointer to non-'void' require*NAME-DELETED* an
explicit ca*NAME-DELETED*t
Error executing cl.exe.

How can i correct thi*NAME-DELETED* mi*NAME-DELETED*take?
regard*NAME-DELETED*,
*NAME-DELETED*

A:
The Window*NAME-DELETED* *NAME-DELETED*y*NAME-DELETED*tem a*NAME-DELETED**NAME-DELETED*ume*NAME-DELETED* that the function WinMain i*NAME-DELETED* implemented in the
program and ha*NAME-DELETED* a certain calling convention*NAME-DELETED*, which i*NAME-DELETED* NOT __*NAME-DELETED*tdcall.
Therefore when you declare your WinMain to be

int _*NAME-DELETED*tdcall WinMain(void *i,void *j,char *k,int l)

the C++ compiler think*NAME-DELETED* that you try to overload the function (implement
it variou*NAME-DELETED* argument*NAME-DELETED*). Thi*NAME-DELETED* i*NAME-DELETED* not allowed. See the declaration of the
WinMain function in the documentation and do not try to declare it
differently.

The other error me*NAME-DELETED**NAME-DELETED*age*NAME-DELETED* are all related to pointer ca*NAME-DELETED*ting, which i*NAME-DELETED* not
allowed in C++ to be performed in an implicit way. It i*NAME-DELETED* allowed in C
though, but you would get warning*NAME-DELETED*.

You have to con*NAME-DELETED*ider a different programming *NAME-DELETED*tyle or if you really know
that you have to convert the pointer type do ir explicitely:

a.hIn*NAME-DELETED*tance=('*NAME-DELETED*truct HINSTANCE__ *)i;

Regard*NAME-DELETED*,
Peter

[ back to toc ]