高手请进(如何用winsocket api 写客户端的数据接收)(50分)

A

aq100

Unregistered / Unconfirmed
GUEST, unregistred user!
各位虾哥虾姐,请问用winsocket api如何写客户端的数据接收,十万火急,50分。
 
用以下函数就可以了,具体你查一下好了
connect()//连接server
select()//判断是否可以读
read()/recv()//读数据
 
我是第一次用api写socket ,所以您最好能写出这段能执行的代码,非常非常感谢。
 
char szRecv[20];
CString szIP("127.0.0.1");
UINT uPort=6800;
//接收UDP数据
int iRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);
TRACE("received%d byte/n",iRecv);
//---------------------------------------------------
//创建本地套接口
m_sockRecv.Create(6801,SOCK_DGRAM,FD_ACCEPT);
//绑定本地套接口
m_sockRecv.Bind(6801,"127.0.0.1");
//创建一个定时器定时读取
SetTimer(1,3000,NULL);
 
真是不好意思,补充一下我的哪个是基于tcp/ip协议的数据接收。
 
我有很多用winsock写代码[:)]
 
老张同志:你这明显是在诱惑我吗,既然你有那么多的东西,怎么说也应该发一份给我啊,
可以的话,你会有所收获的哦,先表示一下诚意吗:)。发一个winsock api写的client和server吧
 
delphi版的哦,别的我都有,可是看不懂
 
我也来学习!!!
发一个winsock api写的client和server吧
xxhsh@163.net
 
大富翁上的高手都到那去了啊,这么个问题都搞不定吗。虾哥虾姐:快点啦,帮帮忙吗。
小弟我还得靠这吃饭呢,不会这么忍心看我失业吧。100分怎样,这可是俺穷人财富的
一半啊。
 
我的QQ 775033 联系
 
先搞清楚TCP or UDP?
 
unit My_Socket;

interface

uses
Windows, Messages, SysUtils, Variants, Classes,
winsock;



Function MyConnect(vport:integer;vaddr:string):bool;
function MyRecv(vData:pchar;vLen:integer;vTimeout:integer):integer;
function MyLoadSocket:bool;
procedure MyUnLoadSocket;
procedure MyClose;
implementation
var
MywsAdata:TWSAData; MySocket:Tsocket;

Function MyConnect(vport:integer;vaddr:string):bool;
var
LAddrIn:TsockAddr;
begin
Result:=false;
LaddrIn.sin_port := htons(vPort);
LaddrIn.sin_family := AF_INET;
LaddrIn.sin_addr.S_addr :=inet_addr(pchar(vaddr));
Mysocket := socket(AF_INET, SOCK_STREAM, IPPROTO_tcp);
if Mysocket = INVALID_SOCKET then
Exit;
if Connect(Mysocket, LaddrIn,sizeof(TSockAddr)) = SOCKET_ERROR then
begin
CloseSocket(MySocket);
Exit;
end;
Result:=true;
end;

procedure MyClose;
begin
CloseSocket(mySocket);
end;
function MyRecv(vData:pchar;vLen:integer;vTimeout:integer):integer;
var
FDRead: TFDSet;
LTimeout: TTimeVal;
begin
Result:=-1;
FD_ZERO(FDRead);
FD_SET(MySocket,FdRead);
if vTimeout<=0 then
Result:=Select(0, @FDRead, nil, nil, nil)
else begin
LTimeout.tv_sec := vTimeout div 1000;
LTimeout.tv_usec := (vTimeout mod 1000) * 1000;
Result:=Select(0, @FDRead, nil,nil, @LTimeout);
end;
if Result=1 then
begin
Result:=Recv(MySocket,vdata^,vlen,0);
if Result=Socket_Error then
Result:=-WsaGetLastError
end
else
Result:=-WsaGetLastError

end;

function MyLoadSocket:bool;
begin
fillchar(MywsAdata,sizeof(TWSAData),0);
Result:=WSAStartup($101,MywsAdata)=0;
end;


procedure MyUnLoadSocket;
begin
WSACleanup;
end;
end.
 
这是我写一个很基本的测试我的做的服务器的程序,用API写的

unit SendFile;

interface

uses
Classes,WinSock,Windows,SysUtils,StdCtrls;

const
MAXSIZE=128;

type
TSendFile = class(TThread)
private
{ Private declarations }
Send_filesock:Tsocket;
Send_Port,Thread_Id,Send_Len:integer;
Send_Ip,LogStr:string;
Re_Message:TMemo;
procedure Record_Message;
protected
procedure Execute; override;
public
constructor CreateSendFile(Port,Num:integer;Ip:string;
Memo:TMemo);
destructor Destroy;override;
end;

implementation


{ TSendFile }

procedure TSendFile.Record_Message;
begin

Re_Message.Lines.Add(LogStr);
Re_Message.Lines.SaveToFile('temp.ini');
end;

constructor TSendFile.CreateSendFile(Port,Num:integer;Ip:string;
Memo:TMemo);
begin
inherited Create(true);
Send_Ip:=Ip;
Send_Port:=Port; //传递参数给类变量
freeonterminate:=true;
Thread_ID:=Num;
Re_Message:=Memo;
LogStr:=Send_ip+'线程已启动...'+TimeToStr(Now);
Record_Message;
Resume; //启动线程
end;

destructor TSendFile.Destroy;
begin
if Send_filesock<>INVALID_SOCKET then
begin
CloseSocket(Send_FileSock);
LogStr:=IntToStr(Thread_ID)+'进程已释放...'+TimeToStr(Now);
Synchronize(Record_Message);
end;
inherited Destroy;
end;

procedure TSendFile.Execute;
var
Ra:SOCKADDR_IN;
hostaddr:u_long;
FileInfo:pchar;
i:integer;
begin
Send_FileSock:=Socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //创建套接字

if Send_filesock=INVALID_SOCKET then
begin
LogStr:=Send_IP+'线程创建WinSock出错!';
Synchronize(Record_Message); //创建失败-1
exit;
end;

Ra.sin_family:=PF_INET;

Ra.sin_port:=htons(Send_Port);

hostaddr:=inet_addr(PChar(Send_Ip));

if hostaddr=-1 then
begin
CloseSocket(Send_FileSock);
LogStr:=Send_IP+'线程的对方IP出错...'+TimeToStr(Now);
Synchronize(Record_Message); //IP出错-2
exit;
end;
Ra.sin_addr.S_addr:=hostaddr;

if Connect(Send_FileSock,Ra,Sizeof(Ra))<>0 then
begin
CloseSocket(Send_FileSock);
LogStr:=Send_IP+'线程的对方连接出错!';
Synchronize(Record_Message); //连接服务器失败
end
else
begin
//发送对应的线程的总大小信息
//St fileinfo 发送的消息字符
//Send_Size 发送的数据大小
GetMem(FileInfo,MAXSIZE);
try
for i:=1 to 4 do
begin
sleep(20);
FillChar(FileInfo^,MAXSIZE,0);
StrCopy(FileInfo,PChar('*****************'));

Send_Len:=Send(Send_FileSock,FileInfo^,Length(FileInfo),0);
if Send_Len=SOCKET_ERROR then
begin
//CloseSocket(Send_FileSock);
LogStr:=Send_IP+' '+inttostr(i)+'线程的对方没有接受...'+TimeToStr(Now);
Synchronize(Record_Message);
break;
end;
end;
finally
FreeMem(FileInfo);
end;
end;
end;

end.
 
我少了调用增加WINSOCK。DLL的引用记数就OK了,关闭程序时释放就可以了
 
天色以晚,太累了,俺也要回去睡觉啦。看mywyn还是比较够意思,分数就给你啦。
老张同志:我的QQ是14402921,交个朋友吧,以后还有很多要请教你的,在此也非常感谢。
 
多人接受答案了。
 
有的话发一分给我,谢谢
 
顶部