很简单的UDP例子,为什么老没有正常结果啊
gloom 2003-12-09 03:32:12 我用API创建一个简单的UDP winsock,并响应消息,同样的程序两份,一个运行在我本机上,192.168.0.27,一个运行在局域网另一台机器上,192.168.0.10,
.10向我机.27上连接并发送“Target”,但我机上一点也没有,倒是在.10机上能收到一个空信息,这是怎么回事啊
//.h文件
//---------------------------------------------------------------------------
#define WM_SOCKET_NOTIFY WM_USER+100
#define UDP_PORT 10001
#define BUF_SIZE 255
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
__fastcall ~TMainForm()
{
closesocket(m_Socket);
WSACleanup();
};
SOCKET m_Socket;
char RcvBuf[BUF_SIZE];
struct sockaddr RemoteAdd;
virtual void __fastcall WndProc(Messages::TMessage& Msg);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
//.cpp
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
//检测Winsock版本
WSADATA wsaData;
int iErrCode = WSAStartup(MAKEWORD(2,1),&wsaData);
if(iErrCode==SOCKET_ERROR)
{
Application->Terminate();
}
else
{
//创建Winsock
m_Socket=socket(AF_INET,SOCK_DGRAM,0);
if(m_Socket==INVALID_SOCKET)
{
Application->Terminate();
}
else
{
//加入消息
WSAAsyncSelect(m_Socket,this->Handle,
WM_SOCKET_NOTIFY,FD_READ|FD_CONNECT);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::WndProc(Messages::TMessage& Msg)
{
WORD wEvent,wError;
SOCKET hSocket;
struct sockaddr_in fromadd;
int fromlen=sizeof(fromadd);
int rcvlen=BUF_SIZE;
//响应消息
if(Msg.Msg ==WM_SOCKET_NOTIFY)
{
wEvent=LOWORD(Msg.LParam);
wError=HIWORD(Msg.LParam);
hSocket=(SOCKET)Msg.WParam;
switch(wEvent)
{
case FD_CONNECT:
if(wError)
{
MessageBox(NULL,"连接错误","错误",MB_OK);
break;
}
break;
case FD_READ:
if(wError)
{
MessageBox(NULL,"接收错误","错误",MB_OK);
break;
}
rcvlen=recvfrom(m_Socket,RcvBuf,rcvlen,0,(struct sockaddr*)&fromadd,&fromlen);
//if(rcvlen>0)
//不知道为什么,这里rcvlen总是-1,收到的的值也是空的。
{
if(strcmp(RcvBuf,"Source")==0)
{
memcpy((void*)&RemoteAdd,(void*)&fromadd,sizeof(fromlen));
}
else if(strcmp(RcvBuf,"Target")==0)
{
send(m_Socket,(char*)&fromadd,sizeof(fromadd),0);
}
else
{
MessageBox(NULL,RcvBuf,"提示",MB_OK);
}
}
break;
default:
break;
}
}
else
{
TWinControl::WndProc(Msg);
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
char buf[]="Target";
struct sockaddr_in add;
add.sin_family=AF_INET;
add.sin_port=htons(UDP_PORT);
add.sin_addr.s_addr = inet_addr(edtHost->Text.c_str());
int err=0;
err=connect(m_Socket,(struct sockaddr *)&add,sizeof(add));
if(err==0)
{
sendto(m_Socket,buf,strlen(buf),0,(struct sockaddr*)&add,sizeof(add));
}
}
//---------------------------------------------------------------------------