求救!!!连接成功,发送成功,为什么收不到数据,为什么为什么?!你们试下,有木有?!有木有?!直接贴代码
//服务器端 Form创建都有WSAStartUp----------------------------
procedure TFrmServer.Button1Click(Sender: TObject);
var
dThreadID: DWORD;
iInt, iRes: Integer;
SocketAddr: SockAddr_In;
begin
SocketSer := Socket(AF_INET, SOCK_STREAM, IPPROTO_IP); //TCP:SOCK_STREAM //UDP: SOCK_DGRAM
if SocketSer = INVALID_SOCKET then begin
ShowMessage('创建socket出错!');
Exit;
end; with SocketAddr do begin
sin_family := AF_INET; iRes := Inet_addr(PChar(Edit1.text));
if iRes = INADDR_NONE then begin
ShowMessage('无效IP!');
Exit;
end;
sin_addr.S_addr := iRes; Val(Edit2.Text, iInt, iRes);
if iRes <> 0 then begin
ShowMessage('无效端口!');
Exit;
end;
sin_port := htons(iInt); if Bind(SocketSer, SocketAddr, SizeOf(SocketAddr)) <> 0 then begin
ShowMessage('绑定socket出错');
Exit;
end;
end; if Listen(SocketSer, SOMAXCONN) = SOCKET_ERROR then begin
ShowMessage('监听出错!');
Exit;
end; LExit := False;
Button1.Enabled := False;
BeginThread(nil, 0, @ServerAccept, Pointer(SocketSer), 0, dThreadID);
end;
procedure ServerAccept(LSock: TSocket); stdcall;
var
IP :string;
SockAddr: SockAddr_In;
SockAddr_Len: Integer;
SocketRecev: TSocket;
pNewClient: pClients;
begin
SockAddr_Len := SizeOf(SockAddr); while not LExit do begin
SocketRecev := accept(LSock, @SockAddr, @SockAddr_Len);
if SocketRecev < 1 then begin
Sleep(500);
Continue;
end;
IP := IntToHex(SocketRecev, 2)
+ '-' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b1))
+ '.' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b2))
+ '.' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b3))
+ '.' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b4))
;
FrmServer.Memo1.Lines.Append(IP); GetMem(pNewClient, SizeOf(TClients));
NowSocket := SocketRecev;
pNewClient.Socket := SocketRecev;
pNewClient.SocketAddr := SockAddr;
LList.Add(pNewClient);
SocketWorkThread(SocketRecev);
end;
EndThread(0);
end;
procedure SocketWorkThread(LSock: TSocket);
var
iRes: Integer;
BufRecv: pChar;
begin
GetMem(BufRecv, BufLen);
ZeroMemory(bufRecv, buflen);
iRes := recv(LSock, BufRecv, BufLen, 0);
if iRes < 1 then begin
if iRes = SOCKET_ERROR then begin
for iRes := 0 to LList.Count -1 do
if LSock = pClients(LList.Items[iRes]).Socket then begin
LList.Delete(iRes);
Break;
end;
CloseSocket(LSock);
FrmServer.Memo1.Lines.Add(IntToHex(LSock, 2)+'退出');
end;
end else
FrmServer.Memo1.Lines.Add(BufRecv);
FreeMem(BufRecv);
end;
//发送消息 〈〈------------------------------------------------
procedure TFrmServer.Button3Click(Sender: TObject);
var
Info:string;
BufSend: pchar;
Re:Integer;
begin
if NowSocket = -1 then Exit;
GetMem(BufSend,BufLen);
ZeroMemory(BufSend,BufLen);
Info:=Edit3.Text;
StrPCopy(BufSend,Info);
Re:=send(NowSocket, BufSend^, Length(BufSend), 0);
if Re = SOCKET_ERROR then begin
ShowMessage('发送数据失败');
Exit;
end;
FreeMem(BufSend);
end;
----------------------------------------------------------------------------------
//客户端 Form创建都有WSAStartUp
procedure TFrmClient.Button1Click(Sender: TObject);
var
dThreadID: DWORD;
iInt, iRes: Integer;
SocketAddr: SockAddr_In;
begin
SocketCl := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if SocketCl = INVALID_SOCKET then begin
ShowMessage('建立socket出错!');
Exit;
end; with SocketAddr do begin
sin_family := AF_INET; iRes := inet_addr(PChar(Edit1.text));
if iRes = INADDR_NONE then begin
ShowMessage('无效IP!');
Exit;
end;
sin_addr.S_addr := iRes; Val(Edit2.Text, iInt, iRes);
if iRes <> 0 then begin
ShowMessage('无效端口!');
Exit;
end;
sin_port := htons(iInt);
end; if Connect(SocketCl, SocketAddr, SizeOf(SocketAddr)) <> 0 then begin
ShowMessage('连接错误');
Exit;
end;
LExit := False;
Button1.Enabled := False;
BeginThread(nil, 0, @Receive, Pointer(SocketCl),0, dThreadID);
end;
procedure Receive(LSock :TSocket);stdcall;
var
BufRecv: pChar;
iRes: Integer;
begin
GetMem(BufRecv, buflen);
while not LExit do begin
iRes := recv(LSock, BufRecv^, buflen, 0);
if iRes < 1 then begin
Sleep(500);
Continue;
end; FrmClient.memo1.Lines.Add(StrPas(BufRecv));
ZeroMemory(bufRecv, buflen);
end;
FreeMem(BufRecv);
CloseSocket(LSock);
ExitThread(0);
end;
//发送消息 〈〈------------------------------------------------
procedure TFrmClient.Button3Click(Sender: TObject);
var
Info:string;
BufSend: pchar;
Re:Integer;
begin
GetMem(BufSend,BufLen);
ZeroMemory(BufSend,BufLen);
Info:=Edit3.Text;
StrPCopy(BufSend,Info);
Re:=send(SocketCl, BufSend^, Length(BufSend), 0);
if Re = SOCKET_ERROR then begin
ShowMessage('发送数据失败');
Exit;
end;
FreeMem(BufSend);
end;
----------------------------------------------------------------------------------
//服务器端 Form创建都有WSAStartUp----------------------------
procedure TFrmServer.Button1Click(Sender: TObject);
var
dThreadID: DWORD;
iInt, iRes: Integer;
SocketAddr: SockAddr_In;
begin
SocketSer := Socket(AF_INET, SOCK_STREAM, IPPROTO_IP); //TCP:SOCK_STREAM //UDP: SOCK_DGRAM
if SocketSer = INVALID_SOCKET then begin
ShowMessage('创建socket出错!');
Exit;
end; with SocketAddr do begin
sin_family := AF_INET; iRes := Inet_addr(PChar(Edit1.text));
if iRes = INADDR_NONE then begin
ShowMessage('无效IP!');
Exit;
end;
sin_addr.S_addr := iRes; Val(Edit2.Text, iInt, iRes);
if iRes <> 0 then begin
ShowMessage('无效端口!');
Exit;
end;
sin_port := htons(iInt); if Bind(SocketSer, SocketAddr, SizeOf(SocketAddr)) <> 0 then begin
ShowMessage('绑定socket出错');
Exit;
end;
end; if Listen(SocketSer, SOMAXCONN) = SOCKET_ERROR then begin
ShowMessage('监听出错!');
Exit;
end; LExit := False;
Button1.Enabled := False;
BeginThread(nil, 0, @ServerAccept, Pointer(SocketSer), 0, dThreadID);
end;
procedure ServerAccept(LSock: TSocket); stdcall;
var
IP :string;
SockAddr: SockAddr_In;
SockAddr_Len: Integer;
SocketRecev: TSocket;
pNewClient: pClients;
begin
SockAddr_Len := SizeOf(SockAddr); while not LExit do begin
SocketRecev := accept(LSock, @SockAddr, @SockAddr_Len);
if SocketRecev < 1 then begin
Sleep(500);
Continue;
end;
IP := IntToHex(SocketRecev, 2)
+ '-' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b1))
+ '.' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b2))
+ '.' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b3))
+ '.' + IntToStr(Ord(SockAddr.sin_addr.S_un_b.s_b4))
;
FrmServer.Memo1.Lines.Append(IP); GetMem(pNewClient, SizeOf(TClients));
NowSocket := SocketRecev;
pNewClient.Socket := SocketRecev;
pNewClient.SocketAddr := SockAddr;
LList.Add(pNewClient);
SocketWorkThread(SocketRecev);
end;
EndThread(0);
end;
procedure SocketWorkThread(LSock: TSocket);
var
iRes: Integer;
BufRecv: pChar;
begin
GetMem(BufRecv, BufLen);
ZeroMemory(bufRecv, buflen);
iRes := recv(LSock, BufRecv, BufLen, 0);
if iRes < 1 then begin
if iRes = SOCKET_ERROR then begin
for iRes := 0 to LList.Count -1 do
if LSock = pClients(LList.Items[iRes]).Socket then begin
LList.Delete(iRes);
Break;
end;
CloseSocket(LSock);
FrmServer.Memo1.Lines.Add(IntToHex(LSock, 2)+'退出');
end;
end else
FrmServer.Memo1.Lines.Add(BufRecv);
FreeMem(BufRecv);
end;
//发送消息 〈〈------------------------------------------------
procedure TFrmServer.Button3Click(Sender: TObject);
var
Info:string;
BufSend: pchar;
Re:Integer;
begin
if NowSocket = -1 then Exit;
GetMem(BufSend,BufLen);
ZeroMemory(BufSend,BufLen);
Info:=Edit3.Text;
StrPCopy(BufSend,Info);
Re:=send(NowSocket, BufSend^, Length(BufSend), 0);
if Re = SOCKET_ERROR then begin
ShowMessage('发送数据失败');
Exit;
end;
FreeMem(BufSend);
end;
----------------------------------------------------------------------------------
//客户端 Form创建都有WSAStartUp
procedure TFrmClient.Button1Click(Sender: TObject);
var
dThreadID: DWORD;
iInt, iRes: Integer;
SocketAddr: SockAddr_In;
begin
SocketCl := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if SocketCl = INVALID_SOCKET then begin
ShowMessage('建立socket出错!');
Exit;
end; with SocketAddr do begin
sin_family := AF_INET; iRes := inet_addr(PChar(Edit1.text));
if iRes = INADDR_NONE then begin
ShowMessage('无效IP!');
Exit;
end;
sin_addr.S_addr := iRes; Val(Edit2.Text, iInt, iRes);
if iRes <> 0 then begin
ShowMessage('无效端口!');
Exit;
end;
sin_port := htons(iInt);
end; if Connect(SocketCl, SocketAddr, SizeOf(SocketAddr)) <> 0 then begin
ShowMessage('连接错误');
Exit;
end;
LExit := False;
Button1.Enabled := False;
BeginThread(nil, 0, @Receive, Pointer(SocketCl),0, dThreadID);
end;
procedure Receive(LSock :TSocket);stdcall;
var
BufRecv: pChar;
iRes: Integer;
begin
GetMem(BufRecv, buflen);
while not LExit do begin
iRes := recv(LSock, BufRecv^, buflen, 0);
if iRes < 1 then begin
Sleep(500);
Continue;
end; FrmClient.memo1.Lines.Add(StrPas(BufRecv));
ZeroMemory(bufRecv, buflen);
end;
FreeMem(BufRecv);
CloseSocket(LSock);
ExitThread(0);
end;
//发送消息 〈〈------------------------------------------------
procedure TFrmClient.Button3Click(Sender: TObject);
var
Info:string;
BufSend: pchar;
Re:Integer;
begin
GetMem(BufSend,BufLen);
ZeroMemory(BufSend,BufLen);
Info:=Edit3.Text;
StrPCopy(BufSend,Info);
Re:=send(SocketCl, BufSend^, Length(BufSend), 0);
if Re = SOCKET_ERROR then begin
ShowMessage('发送数据失败');
Exit;
end;
FreeMem(BufSend);
end;
----------------------------------------------------------------------------------
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货