关于udp的传输问题!

sirius_wind 2009-09-27 01:28:49
在编一个聊天室程序时出现错误: 可以运行,点击相应按钮时报错为地址冲突
可以确定的是视频采集程序、接收都没问题,就只有发送哪有问题。 form5.idpclnt1的使用有问题有问题,换成sever的发送也不行,而这段代码我原来用过,其他改动了,传输这没改动但报错。
源码如下:错误处红色
unit myview;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase,
ExtCtrls, VFW, jpeg, IdUDPClient;
type
TForm5 = class(TForm)
grp2: TGroupBox;
grp3: TGroupBox;
start: TButton;
stop: TButton;
pnl1: TPanel;
idpclnt1: TIdUDPClient;
procedure startClick(Sender: TObject);
procedure stopClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
form5:Tform5;
CapWnd: THandle; //定义捕获窗句柄
CapParms: TcaptureParms; //用于设置设备属性的结构变量
BMPINFO: TBitmapInfo; //BMP图像信息

implementation
uses
chatlist,wl,otherview; //viewrec chatwindows,
{$R *.dfm}

function FrameCallBack(hWnd: HWND; lpVHdr: PVIDEOHDR): LongInt; stdcall;
var hd: Thandle;
jpg: TJpegImage;
memStream: TMemoryStream;
Bitmap: TBitmap;
i: integer;
ptemp: Potherviewform;
begin
//将数据显在Image,
Bitmap := TBitmap.Create;
Bitmap.Width := BMPINFO.bmiHeader.biWidth; // New size of Bitmap
Bitmap.Height := BMPINFO.bmiHeader.biHeight;
hd := DrawDibOpen;
DrawDibDraw(hd, Bitmap.canvas.handle, 0, 0, BMPINFO.BmiHeader.biwidth, BMPINFO.bmiheader.biheight, @BMPINFO.bmiHeader,
lpVHdr^.lpData, 0, 0, BMPINFO.bmiHeader.biWidth, BMPINFO.bmiHeader.biheight, 0);
DrawDibClose(hd);
//发送数据
memStream := TMemoryStream.Create;
jpg := TJpegImage.Create;
jpg.Assign(Bitmap);
jpg.CompressionQuality := 40; //jpg压缩质量
jpg.JPEGNeeded;
jpg.Compress;
jpg.SaveToStream(memStream);
jpg.Free;
form5.idpclnt1.BroadcastEnabled := true; //注释掉部分与发送对象有关,可以直接换成本地某端口
// //计入循环,发送给所有在视频列表的终端
// for i := 2 to viewnum do
// begin
ptemp := potherhead.next;
//form1.edt1.Text:=ptemp^.ip;
if memStream.Size > form5.idpclnt1.BufferSize then //端口基数 9000
begin
form5.idpclnt1.SendBuffer(ptemp^.ip, (localport + ptemp^.port + 9000), memStream.Memory^, form5.idpclnt1.BufferSize);
end
else
begin
form5.idpclnt1.SendBuffer(ptemp^.ip, (localport + ptemp^.port + 9000), memStream.Memory^,memStream.Size);
end;

// ptemp := ptemp^.next;
//// end;


memStream.Free;
Bitmap.Free;
end;

procedure TForm5.startClick(Sender: TObject);
begin
CapWnd := capCreateCaptureWindow('我的窗口',
WS_VISIBLE or WS_CHILD, //窗口样式
0, //X坐标
0, //Y坐标
pnl1.Width, //窗口宽
pnl1.Height, //窗口高
pnl1.handle, //窗口句柄
0); //通常为0
if CapWnd = 0 then exit;
//定义帧捕捉回调函数
CapSetCallbackOnFrame(CapWnd,FrameCallBack);
CapParms.dwRequestMicroSecPerFrame := 1;
CapParms.fLimitEnabled := FALSE;
CapParms.fCaptureAudio := FALSE;
CapParms.fMCIControl := FALSE;
CapParms.fYield := TRUE;
CapParms.vKeyAbort := VK_ESCAPE;
CapParms.fAbortLeftMouse := False;
CapParms.fAbortRightMouse := FALSE;
//让设置生效
CapCaptureSetSetup(capWnd, @CapParms, sizeof(TCAPTUREPARMS));
CapPreviewRate(capWnd, 33); //设置预览视频的频率
CapCaptureSequenceNoFile(capWnd); //如果要捕获视频流,则要使用函数来指定不生成文件,不然会自动生成AVI文件
CapDriverConnect(CapWnd, 0);
//连接摄像头设备,第二个参数是个序号,当系统中装有多个显示驱动程序时,其值分别依次为0到总个数如果有多个摄像头,那么就是0->1->2
capGetVideoFormat(capWnd, @BMPINFO, sizeof(TBitmapInfo)); //取得视频图像数据头 ???????存入图片里?
CapPreviewScale(capWnd, TRUE); //是否缩放
CapOverlay(capWnd, true); //指定是否使用叠加模式,true为使用,否则为false
CapPreview(capWnd, true);
end;
procedure TForm5.stopClick(Sender: TObject);
var
i: integer;
ptemp: Potherviewform;
AMessage, str: string;

begin
capCaptureAbort(CapWnd); //停止捕获
capDriverDisconnect(CapWnd); //将捕获窗同驱动器断开
//发送给正在与其视频的终端,通知我已经关闭视频,消息模式为*speek*
for i := 1 to viewnum do
begin
ptemp := potherhead.next;
str := '15*;' + '11*;' + 'clred *;' + '1'; //第一项可能有问题,要看看是什么样的字符串
AMessage := '*Speek*;' + form1.UServer.LocalName + '*;' + str + '*;' + '你看不到他了';
form1.Userver.Send(ptemp^.name, Cport, AMessage);
AMessage:='*comdviewstop*;'+ form1.UServer.LocalName+'*;';
form1.Userver.Send(ptemp^.name, Cport, AMessage);
///前者通知对方终端的操作人员,后者用于通知终端本身
ptemp := ptemp^.next;
end;
end;

procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
var
i: integer;
ptemp: Potherviewform;
AMessage, str: string;
begin
//发送给正在与其视频的终端,通知我已经关闭视频,消息模式为*speek*
for i := 1 to viewnum do
begin
ptemp := potherhead.next;
str := '15*;' + '11*;' + 'clred *;' + '1'; //第一项可能有问题,要看看是什么样的字符串
AMessage := '*Speek*;' + form1.UServer.LocalName + '*;' + str + '*;' + '你看不到他了';
form1.Userver.Send(ptemp^.name, Cport, AMessage);
AMessage:='*comdviewstop*;'+ form1.UServer.LocalName+'*;';
form1.Userver.Send(ptemp^.name, Cport, AMessage);
///前者通知对方终端的操作人员,后者用于通知终端本身
ptemp := ptemp^.next;
end;
free;
pmyvhead:=nil;
end;
end.

...全文
72 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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