UDP接收程序不能走到OnRecv(TMessage &Msg),原因为句柄不对,如何解决?
附程序原文:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
#include "winsock.h"
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <vcl/dstring.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#define DATABUFLEN 256
struct sockaddr_in server;
struct hostent *hp;
unsigned char servername[20];
char szTmp[80];
unsigned char temp[256];
int sockfd,fin,len,sockport;
long fileLength=0;
FILE *recFile;
BOOL Finished;
HWND hwnd=FindWindow("TForm1","广播接收平台");
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WSADATA WSAData;
BOOL optval=TRUE;
recFile=fopen(Edit2->Text.c_str(),"w+b");
if(recFile==NULL){
MessageBox(NULL,"Can't open recv file!","Warning",MB_ICONEXCLAMATION);
exit(EXIT_FAILURE);
}
int sockport=Edit1->Text.ToInt();
if(WSAStartup((WORD)((1<<8)|1),&WSAData)){
MessageBox(NULL,"wsock32.dll不能被初始化","Warning",MB_ICONEXCLAMATION);
exit(EXIT_FAILURE);
}
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd==INVALID_SOCKET){
sprintf(szTmp,"Client creating socket fail! Error No.is%d",WSAGetLastError());
MessageBox(NULL,szTmp,"Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
exit(EXIT_FAILURE);
}
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons((unsigned short)sockport);
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char FAR*)&optval,sizeof(optval));
if(bind(sockfd,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
{
sprintf(szTmp,"Host binding error! Error No.is%d",WSAGetLastError());
MessageBox(NULL,szTmp,"Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
exit(EXIT_FAILURE);
}
if( setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(CHAR far *)&optval,sizeof(optval))==SOCKET_ERROR)
{
closesocket(sockfd);
sprintf(szTmp,"Broadcast setting error! Error No.is%d",WSAGetLastError());
MessageBox(NULL,szTmp,"Warning",MB_ICONEXCLAMATION);
exit(EXIT_FAILURE);
}
if( WSAAsyncSelect(sockfd,hwnd,UM_SOCK,FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
sprintf(szTmp,"AsyncSelecting error! Error No.is%d",WSAGetLastError());
MessageBox(NULL,szTmp,"Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
}
Edit3->Text=" " ;
// SendMessage
int MsgResult = SendMessage(hwnd, UM_SOCK, 0, 0); // this->Handle
int g=5 ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnRecv(TMessage &Msg)
{
Edit3->Text=" df " ;
int t=4;
int length,namelen;
SOCKADDR_IN from;
char ztf[256],wg[80];
Finished=FALSE;
switch(WSAGETSELECTEVENT(Msg.LParam))
{
case FD_READ:
namelen=sizeof(SOCKADDR);
if((length=recvfrom(sockfd,ztf,256,0,(struct sockaddr FAR*)&from,(int FAR*)&namelen))==SOCKET_ERROR)
{
if(WSAGetLastError()!=WSAEWOULDBLOCK)
{
sprintf(wg,"Send data failure!Error No. is%d",WSAGetLastError());
MessageBox(NULL,szTmp,"Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
break;
}
}
len=len+length;
if(length==0)
{
sprintf(wg,"client's socket had closed");
MessageBox(NULL,wg,"Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
}
fileLength+=length;
fseek(recFile,fileLength,SEEK_SET);
fwrite(ztf,sizeof(char),length,recFile);
MessageBox(NULL,"OK","ok",MB_OK);
if(length<256)Finished=TRUE;
if(Finished)
if( WSAAsyncSelect(sockfd,hwnd,UM_SOCK,FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
sprintf(szTmp,"AsyncSelecting failer2! Error No.is%d",WSAGetLastError());
MessageBox(NULL,wg,"Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
}
else{
MessageBox(NULL,"datagram had all recved","Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
}
break;
case FD_CLOSE:
Finished=FALSE;
MessageBox(NULL,"datarecv had finished,Socket's been close","Warning",MB_OK);
if( WSAAsyncSelect(sockfd,hwnd,0,0)==SOCKET_ERROR)
{
sprintf(wg,"AsyncSelecting failer3! Error No.is%d",WSAGetLastError());
MessageBox(NULL,wg,"Warning",MB_ICONEXCLAMATION);
}
closesocket(sockfd);
break;
default:
if(WSAGETSELECTERROR(Msg.LParam)!=0){
MessageBox(NULL,"socket failure","Warning",MB_ICONEXCLAMATION);
closesocket(sockfd);
int gg=4; }
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int MsgResult = SendMessage(this->Handle, UM_SOCK, 0, 0);
}
//---------------------------------------------------------------------------