﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-学好delphi-随笔分类-delphi  winsock</title><link>http://www.cnitblog.com/shuyezi122/category/8018.html</link><description>我delphi笔记,你的参与就是对我最大的支持,还有汇编语言也在学
我的QQ群:79598397
</description><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 08:07:42 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 08:07:42 GMT</pubDate><ttl>60</ttl><item><title>得到mac地址</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/02/03/54137.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Mon, 02 Feb 2009 16:53:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/02/03/54137.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/54137.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/02/03/54137.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/54137.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/54137.html</trackback:ping><description><![CDATA[<p>unit Unit1;</p>
<p>interface</p>
<p>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls,nb30;</p>
<p>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp;&nbsp;&nbsp; Label1: TLabel;<br>&nbsp;&nbsp;&nbsp; Edit1: TEdit;<br>&nbsp;&nbsp;&nbsp; Button1: TButton;<br>&nbsp;&nbsp;&nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; private<br>&nbsp;&nbsp;&nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp;&nbsp;&nbsp; { Public declarations }<br>&nbsp; end;</p>
<p>var<br>&nbsp; Form1: TForm1;</p>
<p>implementation</p>
<p>{$R *.DFM}</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br>Var<br>&nbsp; NCB : TNCB;<br>&nbsp; ADAPTER : TADAPTERSTATUS;<br>&nbsp; LANAENUM : TLANAENUM;<br>&nbsp; intIdx : Integer;<br>&nbsp; re : Char;<br>&nbsp; buf : String;<br>begin<br>&nbsp; Try<br>&nbsp;&nbsp;&nbsp; // Reset adapter<br>&nbsp;&nbsp;&nbsp; ZeroMemory(@NCB, SizeOf(NCB));<br>&nbsp;&nbsp;&nbsp; NCB.ncb_command := Chr(NCBRESET);<br>&nbsp;&nbsp;&nbsp; NCB.ncb_lana_num := LANAENUM.lana[0];//important<br>&nbsp;&nbsp;&nbsp; re := NetBios(@NCB);<br>&nbsp;&nbsp;&nbsp; If Ord(re)&lt;&gt;0 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</p>
<p>&nbsp;&nbsp;&nbsp; // Get adapter address<br>&nbsp;&nbsp;&nbsp; ZeroMemory(@NCB, SizeOf(NCB));<br>&nbsp;&nbsp;&nbsp; NCB.ncb_command := Chr(NCBASTAT);<br>&nbsp;&nbsp;&nbsp; NCB.ncb_lana_num := LANAENUM.lana[0];////bowman<br>&nbsp;&nbsp;&nbsp; StrPCopy(NCB.ncb_callname, '*');<br>&nbsp;&nbsp;&nbsp; NCB.ncb_buffer := @ADAPTER;<br>&nbsp;&nbsp;&nbsp; NCB.ncb_length := SizeOf(ADAPTER);<br>&nbsp;&nbsp;&nbsp; re := NetBios(@NCB);<br>&nbsp;&nbsp;&nbsp; If Ord(re)&lt;&gt;0 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</p>
<p>&nbsp;&nbsp;&nbsp; buf := '';<br>&nbsp;&nbsp;&nbsp; For intIdx := 0 To 5 Do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buf := buf + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2)+'-';<br>&nbsp;&nbsp;&nbsp; edit1.Text := copy(buf,0,length(buf)-1);<br>&nbsp; Finally <br>&nbsp; End; </p>
<p>end;</p>
<p>end.</p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/54137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-02-03 00:53 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/02/03/54137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WSAAsyncGetHostByName()</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54132.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Mon, 02 Feb 2009 14:06:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54132.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/54132.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/54132.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/54132.html</trackback:ping><description><![CDATA[<p>这个函数是GetHostByName()异步版本<br>这个函数不会引起阻塞,由于使用时要用到消息,所以有点麻烦,不过会者不难<br>声明如下:<br>HANDLE PASCAL FAR WSAAsyncGetHostByName ( HWND hWnd,<br>unsigned int wMsg, const char FAR * name, char FAR * buf,<br>int buflen );<br>　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>hWnd 当异步请求完成时,应该接收消息的窗口句柄.<br>wMsg 当异步请求完成时,将要接收的消息.<br>name 指向主机名的指针.<br>buf 接收hostent数据的数据区指针.注意该数据区必须大于hostent结构的大小.这是因为不仅Windows Sockets实现要用该数据区域容纳hostent结构,hostent结构的成员引用的所有数据也要在该区域内.建议用户提供一个MAXGETHOSTSTRUCT字节大小的缓冲区.<br>buflen 上述数据区的大小.<br><br>我们用这个函数实现上节中同一功能:得到网站IP<br><br>全部代码如下:<br>unit Unit1;</p>
<p>interface</p>
<p>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls;<br>&nbsp; //下面自己定义一个消息,因为这个函数必须用到<br>const<br>wm_getip=wm_user+100;//自己定义一个消息,<br>&nbsp;&nbsp; type<br>&nbsp; Tgetip=record//消息的结构<br>&nbsp; msg:word;<br>&nbsp; wparam:word;<br>&nbsp; lparam:word;<br>&nbsp; end;<br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp;&nbsp;&nbsp; Button1: TButton;<br>&nbsp;&nbsp;&nbsp; Edit1: TEdit;<br>&nbsp;&nbsp;&nbsp; Edit2: TEdit;<br>&nbsp;&nbsp;&nbsp; Edit3: TEdit;<br>&nbsp;&nbsp;&nbsp; Button2: TButton;<br>&nbsp;&nbsp;&nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp;&nbsp;&nbsp; procedure Button2Click(Sender: TObject);</p>
<p>&nbsp; private<br>&nbsp;&nbsp;&nbsp; { Private declarations }<br>procedure mymsg(var msg:Tgetip);Message wm_getip;//这就是消息函数<br>&nbsp; public<br>&nbsp;&nbsp;&nbsp; { Public declarations }<br>&nbsp; end;</p>
<p>var<br>&nbsp; Form1: TForm1;</p>
<p>implementation<br>uses<br>winsock;</p>
<p>{$R *.dfm}</p>
<p>var<br>WData:tWSAData;<br>HEnt:HostEnt;<br>IPad:string;<br>h:thandle;</p>
<p>procedure tform1.mymsg(var msg:tgetip);<br>begin<br>&nbsp;with HEnt do<br>IPad:=Format('%d.%d.%d.%d',[Byte(h_addr^[0]),Byte(h_addr^[1]),Byte(h_addr^[2]),Byte(h_addr^[3])]);<br>edit2.Text:=HEnt.h_name;<br>edit3.Text:=ipad;//得到ip<br>WSACleanup;//注销<br>end;</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>WSAStartup(2,WData);//初始<br>h:=WSAAsyncGetHostByName(self.Handle,wm_getip,pchar(edit1.Text),pchar(@hent),MAXGETHOSTSTRUCT)<br>end;</p>
<p>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>wsacancelasyncrequest(h);//可用于终止,不会引起阻塞<br>end;</p>
<p>end.</p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/54132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-02-02 22:06 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetHostByName()</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54128.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Mon, 02 Feb 2009 10:34:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54128.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/54128.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54128.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/54128.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/54128.html</trackback:ping><description><![CDATA[<p>gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的<span style="COLOR: red">hostent结构</span><span style="COLOR: #ff00ff">指针</span>。<br>所以用前定义<span style="COLOR: #000000">hostent结构,并是一个指针<br><br>var<br>HEnt:PHostEnt;<br><br><br>PHostEnt在delphi定义如下<br>type<br>&nbsp; PHostEnt = ^THostEnt;<br>&nbsp; {$EXTERNALSYM hostent}<br>&nbsp; hostent = record<br>&nbsp;&nbsp;&nbsp; h_name: PChar;//主机名<br>&nbsp;&nbsp;&nbsp; h_aliases: ^PChar;//别名<br>&nbsp;&nbsp;&nbsp; h_addrtype: Smallint;<br>&nbsp;&nbsp;&nbsp; h_length: Smallint;<br>&nbsp;&nbsp;&nbsp; case Byte of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0: (h_addr_list: ^PChar);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1: (h_addr: ^PChar)//IP地址<br>&nbsp; end;<br>&nbsp; THostEnt = hostent;<br><br>下面写个例子<br>得到网站的IP<br>放三个edit在窗口上和一个button<br><br>uses<br>winsock;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>WData:TWSAData;<br>HEnt:PHostEnt;<br>ClName,IPad:string;<br>begin<br>WSAStartup(2,WData);//初始<br>//Gethostname(pchar(ClName),255);得到本机IP</span></p>
<p><span style="COLOR: #000000">HEnt:=GetHostByName(PChar(edit1.Text));//本机改成clname<br>with HEnt^ do<br>IPad:=Format('%d.%d.%d.%d',[Byte(h_addr^[0]),Byte(h_addr^[1]),Byte(h_addr^[2]),Byte(h_addr^[3])]);</span></p>
<p><span style="COLOR: #000000">edit2.Text:=hent^.h_name;//主机名<br>edit3.Text:=ipad;//得到ip</span></p>
<p><span style="COLOR: #000000">WSACleanup;//注销<br>end;<br><br><br>运行结果:(用:www.baidu.com测试)<br>edit1:&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.baidu.com/">www.baidu.com</a><br>edit2:&nbsp;&nbsp;&nbsp; &nbsp;<a href="http://www.a.shifen.com/">www.a.shifen.com</a><br>edit3:&nbsp;&nbsp;&nbsp; 123.235.44.66<br><br></p>
</span>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/54128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-02-02 18:34 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前言 基本函数</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54127.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Mon, 02 Feb 2009 10:25:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54127.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/54127.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/54127.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/54127.html</trackback:ping><description><![CDATA[<p>WSA是windows socket API简称<br>1&nbsp;&nbsp; 在delphi用这些API时,应先先明<br>WSAStartup();//初始<br>WSACleanup;//注销<br><br>后面介绍一些简单函数的使用<br>我也是学了再写,说错的地方指明,这既是自己的笔记<br>也是大家的参考<br><br><br></p>
<p>2、socket函数<br>用于生成socket(soket Descriptor)<br>[声明]<br>SOCKET socket（int af,int type,int protocol）;<br>[参数]<br>af - 地址家族(通常使用:AF_INET)<br>type - socket的种类<br>SOCK_STREAM : 用于TCP协议<br>SOCK_DGRAM : 用于UDP协议<br>protocol - 所使用的协议<br>[返回值]<br>当函数成功调用时返回一个新的SOCKET(Socket Descriptor)<br>失败时返回INVALID_SOCKET.</p>
<p>3、inet_addr函数<br>把好象"xxx.xxx.xxx.xxx"的10进制的IP地址转换为32位整数表示方法<br>[声明]<br>unsigned long inet_addr ( const char FAR *cp );<br>[参数]<br>cp - 指向用"xxx.xxx.xxx.xxx"的10进制来表示的IP地址字符串的指针<br>[返回值]<br>当函数成功调用时返回用32位整数表示的IP地址(按网络字节排列顺序)<br>失败时返回INADDR_NONE.</p>
<p>4、gethostbyname函数<br>可以从主机名获取主机资料.<br>[声明]<br>struct hostent FAR * gethostbyname ( const char FAR *name );<br>[参数]<br>name - 指向主机名字符串的指针<br>[返回值]<br>当函数成功调用时返回主机信息<br>失败时返回NULL(空值)</p>
<p>5、Bind函数<br>指定本地IP地址所使用的端口号时候使用<br>[声明]<br>int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );<br>[参数]<br>s - 指向用Socket函数生成的Socket Descriptor<br>addr - 指向Socket地址的指针<br>namelen - 该地址的长度.<br>[返回值]<br>当函数成功调用时返回0<br>调用失败时返回 SOCKET_ERROR</p>
<p>6、connect函数<br>用于与服务器建立连接,发出连接请求,必须在参数中指定服务器的IP地址和端口号<br>[声明]<br>int connect (SOCKET s , const struct sockaddr FAR *name , int namelen );<br>[参数]<br>s - 指向用Socket函数生成的Socket Descriptor<br>name - 指向服务器地址的指针<br>namelen - 该地址的长度.<br>[返回值]<br>当函数成功调用时返回0<br>调用失败时返回 SOCKET_ERROR</p>
<p>7、select函数<br>可以用于调查一个或多个SOCKET的状态.<br>[声明]<br>int select ( int nfds , fd_set FAR *readfds , fd_set FAR *writefds , fd_set FAR *exceptfds , const struct timeval FAR *timeout );<br>[参数]<br>nfds - 在WINDOWS SOCKET API 中该参数可以忽略,通常赋予NILL值<br>readfds - 由于接受的SOCKET设备的指针<br>writefds - 用于发送数据的SOCKET设备的指针<br>exceptfds - 检查错误的状态<br>timeout - 超时设定<br>[返回值]<br>返回大于0的值时,表示与条件相符的SOCKET数<br>返回0表示超时<br>失败时返回SOCKET_ERROR</p>
<p>8、recv函数<br>利用Socket进行接受数据.<br>[声明]<br>int recv ( SOCKET s , char FAR *buf , int len , int flags );<br>[参数]<br>s - 指向用Socket函数生成的Socket Descriptor<br>buf - 接受数据的缓冲区(数组)的指针<br>len - 缓冲区的大小<br>flag - 调用方式(MSG_PEEK 或 MSG_OOB) <br>[返回值]<br>成功时返回收到的字节数.<br>如果连接被中断则返回0<br>失败时返回 SOCKET_ERROR</p>
<p>9、sendto函数<br>利用Socket进行发送数据.<br>[声明]<br>int sendto ( SOCKET s , const char FAR *buf , int len , int flags , const struct sockaddr FAR *to , int token );<br>[参数]<br>s - 指向用Socket函数生成的Socket Descriptor<br>buf - 接受数据的缓冲区(数组)的指针<br>len - 缓冲区的大小<br>flag - 调用方式(MSG_DONTROUTE , MSG_OOB)<br>to - 指向发送方SOCKET地址的指针<br>token - 发送方SOCKET地址的大小 <br>[返回值]<br>成功时返回已经发送的字节数.<br>失败时返回SOCKET_ERROR</p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/54127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-02-02 18:25 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/02/02/54127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>