to truexf :用TCP&UDP测试工具 做的服务器。我在测试工具中发的数据.这边程序就是收不到数据。
解决方案 »
- 【贺岁第三枪】好汉歌 坛子2010贺岁版
- 有没有一次将一个文件的内容全部读出的函数
- 用OpenPictureDialog只能导入*.bmp文件,如果导*.jpg文件用什么命令?
- 求高手赐教,关于包的问题?
- 哪里有INTRAWEB的学习资料啊
- 怎么点一下dbgrid中的一项,就把那一项内容,添加到listview的相对应的字段中啊?
- adoQuery执行Open的时候提示"无效的授权说明",ADOConn连接SQL2005
- COM+配置问题
- 高分求救~~~sql
- 再送分,来者有份,这次为明天给分,刚才已送出200分,再送200分。
- 求个 RzPageControl 标签页上面的关闭按钮
- TreeView读取节点个数问题
那你收什么?既然服务器没有数据发过来你的recv函数就会阻塞在哪里
我把
BeginThread(nil, 0, @Receive, PChar(skt),0, dThreadID);
改成
BeginThread(nil, 0, @Receive, nil,0, dThreadID);procedure Receive(Sock :TSocket);stdcall;改成
procedure Receive();stdcall;可以接受到数据了,Why?
你线程函数的定义不对
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
var ThreadId: LongWord): Integer;type
TThreadFunc = function(Parameter: Pointer): Integer;这么定义
function Receive(Sock :TSocket): Integer;
to pathletboy:
感谢你们2位,问题解决了,线程函数多加了个stdcall导致接收不到数据。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock, StdCtrls;type
TSocketComm=class(TObject)
private public
constructor Create;
destructor Destroy; override;
function ConnectSvr: Integer;
function SendFrame(Str_SendFrame: string): Integer;
end;type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
edt_SendFrame: TEdit;
mmo_Debug: TMemo;
btn3: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
skt:TSocket;
LExit:Boolean;
Svr_Addr,Clnt_Addr:TSockAddr;
ClientSocket:TSocketComm;procedure Receive(Sock:TSocket);implementation{$R *.dfm}constructor TSocketComm.Create;
var
Wsa:TWSAData;
begin
inherited Create;
if WSAStartup(MakeWord(2,2),Wsa)<>0 then
begin
ShowMessage('Init Socket failed');
WSACleanup;
end;
end;destructor TSocketComm.Destroy;
begin
inherited destroy;
WSACleanup;
closesocket(skt);
end;function TSocketComm.ConnectSvr():Integer;
var
dThreadID:DWORD;
i_RtnCode:Integer;
begin
skt:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if skt=INVALID_SOCKET then
begin
ShowMessage('Create Socket failed');
WSACleanup;
Exit;
end;
Clnt_Addr.sin_family:=AF_INET;
Clnt_Addr.sin_addr.S_addr:=inet_addr('127.0.0.1');
Clnt_Addr.sin_port:=htons(StrToInt('2039'));
bind(skt,Clnt_Addr,SizeOf(Clnt_Addr)); Svr_Addr.sin_family:=AF_INET;
Svr_Addr.sin_addr.S_addr:=inet_addr('192.168.200.95');
Svr_Addr.sin_port:=htons(StrToInt('2038'));
i_RtnCode:=connect(skt,Svr_Addr,SizeOf(Svr_Addr)); if i_RtnCode<>0 then
begin
ShowMessage('Connect 192.168.200.95 failed');
WSACleanup;
Exit;
end;
LExit:=False;
BeginThread(nil, 0, @Receive, PChar(skt),0, dThreadID);
end;procedure Receive(Sock:TSocket);
var
Buffer: pChar;
i,iRes: Integer;
S,Str_RecByte:string;
i_Buf:array[1..1024] of Byte;
begin
GetMem(Buffer, 1024);
while not LExit do
begin
iRes := recv(Sock, Buffer^, 1024, 0);
if iRes < 1 then
begin
Sleep(500);
Continue;
end;
Move(Buffer^,i_Buf,iRes);
for i:=1 to iRes do
begin
Str_RecByte:=IntToHex(i_Buf[i],2);
S:=S+' '+Str_RecByte;
end;
if Copy(S,1,1)=' ' then
begin
Delete(S,1,1);
end;
Form1.mmo_Debug.Lines.Add(S);
ZeroMemory(Buffer, 1024);
end;
FreeMem(Buffer);
// CloseSocket(skt);
ExitThread(0);
end;function TSocketComm.SendFrame(Str_SendFrame:string):Integer;
var
i,i_FrameLen:Integer;
i_Buf:array[1..1024] of Byte;
begin
Str_SendFrame:=StringReplace(Str_SendFrame,' ','',[rfReplaceAll]);
i_FrameLen:=Length(Str_SendFrame) div 2; //Convert string to byte string
for i:=0 to i_FrameLen-1 do
begin
i_Buf[i+1]:=StrToInt('$'+Copy(Str_SendFrame,i*2+1,2));
end;
send(skt,i_Buf,i_FrameLen,0);
end;procedure TForm1.btn1Click(Sender: TObject);
begin
ClientSocket:=TSocketComm.Create;
ClientSocket.ConnectSvr;
end;procedure TForm1.btn2Click(Sender: TObject);
begin
// closesocket(skt);
WSACleanup;
end;procedure TForm1.btn3Click(Sender: TObject);
begin
ClientSocket.SendFrame(Trim(edt_SendFrame.Text));
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
btn2Click(nil);
end;end.