UDP接收程序不能走到OnRecv(TMessage &Msg),原因为句柄不对,如何解决?

dingbing123 2002-10-09 10:37:51
附程序原文:
//---------------------------------------------------------------------------
#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);
}
//---------------------------------------------------------------------------
...全文
58 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
1. 连接oracle时,目录中不能有()字符,否则ADO是无法连接数据库的 修改: 2.1 去掉TCPChannel的BuildPacket函数,改成直接由OnRecv回调函数返回实际数据 去掉UDPChannel的Response函数,改成直接由内部处理 2.2 修改TCPChannel类,实现同步调用接口 定义IRPC接口用来处理同步调用的被调用端 定义Bind函数用来绑定IRPC接口的实例 定义CallEx函数用来实现用户同步调用 2.3 添加bInit变量,用于设置初始化和关闭状态。 设置此变量的目的主要是用来控制,在关闭了socket之后,后续的任何投递都不执行。 修改了IRPC接口名称为IRemoteProcCall,并且调整了部分结构体名称,如RPC相关的结构体, 组合包相关的结构体,以及P2P相关的结构体。 修改TCPChannel类的接口函数Bind成BindEx,使之与TCPChannel的其他接口统一命名。 修改测试Demo,添加多发选项 修改DataType.h中的内存块大小定义 封装临界区类,信号量类 修改TCPListener接口类中的EnumSockets接口,添加pArg参数 Socket类添加ReUseAddr函数,用来设置端口重用 TCPSocket接口类添加GetListener接口用来获得链接管理对象 修改Demo实例中的TCP客户端部分,增加可更改客户端连接数 2.4 添加UDT支持 修改UDPChannel接口类,添加UDT支持接口函数 添加日志支持 添加接口类ILogger,用来实现对日志的输出 添加x64的编译环境 添加部分WARN级别的日志输出 添加C接口,方便非C++语言应用 UDT添加特性,关闭UDT时,给对端发送断线信息,通知对端断线 UDT提高效率,UDT句柄部分改用读写锁来控制,以提高效率 修改OnSend和OnSendTo的行为 修改过的BUG: 1. 数据发送时,如果数据大小正好是MAX_PACKET_SIZE个字节的话,数据发送不出去,在计算包大小时,边界值没处理好。 2. IOCPUnhandledException函数内部逻辑错误,没有关联到自己的异常处理函数中,导致即使调用成功,程序异常了,也无法写dump文件。 3. 修复IOCP UDP Release模式下不能正常运行的BUG。由于传递的输出参数使用了局部变量导致的问题 4. 修复UDT发送时,计算尾包大小错误 5. 修复UDT快速发送错误 6. 修改Queue关闭时,如果有线程正在等待信号,会导致线程死等

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧