<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[关于php和C语言接口的结构传递问题,udp，tcp通信]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 26 Nov 2009 16:32:48 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	在实际开发中,有时会遇到PHP和C语言结构的互相转化问题,这时候PHP的函数pack和unpack就能帮上大忙了.<br/>pack()将数据打包成二进制串<br/>unpack()从字串中的二进制串转化成指定的格式<br/>Code Description<br/>a NUL-padded string<br/>A SPACE-padded string<br/>h Hex string, low nibble first<br/>H Hex string, high nibble first<br/>c signed char<br/>C unsigned char<br/>s signed short (always 16 bit, machine byte order)<br/>S unsigned short (always 16 bit, machine byte order)<br/>n unsigned short (always 16 bit, big endian byte order)<br/>v unsigned short (always 16 bit, little endian byte order)<br/>i signed integer (machine dependent size and byte order)<br/>I unsigned integer (machine dependent size and byte order)<br/>l signed long (always 32 bit, machine byte order)<br/>L unsigned long (always 32 bit, machine byte order)<br/>N unsigned long (always 32 bit, big endian byte order)<br/>V unsigned long (always 32 bit, little endian byte order)<br/>f float (machine dependent size and representation)<br/>d double (machine dependent size and representation)<br/>x NUL byte<br/>X Back up one byte<br/>@ NUL-fill to absolute position<br/>例如,<br/>typedef struct _BorrowInfo<br/>&#123;<br/>char mobile[32];<br/>char area[8];<br/>int&nbsp;&nbsp; type;<br/>int&nbsp;&nbsp; ret<br/>&#125; BorrowInfo<br/><br/>&lt;?<br/>//将PHP变量转成结构<br/>$type=100;<br/>$mobile=&quot;13901234567&quot;;<br/>$ret=0;<br/>$area=&quot;BJ&quot;;<br/>$returnstr=sprintf(&quot;%-32s,$mobile).sprintf(&quot;%-8s,$area).pack(&quot;l&quot;,$type).pack(&quot;l&quot;,$ret);<br/>//将结构转成php变量<br/>//对于字符型变量可以直接取得<br/>$moible=substr($returnstr,0,32);<br/>$area=substr($returnstr,32,8);<br/><br/>$fuckarray=unpack(&quot;nint&quot;,substr($returnstr,40,4));<br/>$type=$fuckarray[&#039;int&#039;];<br/>//RET变量也可以向type类似取得<br/><br/>?&gt;<br/>需要注意的事,C语言结构由于内存对齐方式和机器字节顺序问题,需要对代码进行微调,才能正常使用.<br/>比如将结构体构体的手机号设为25位,则整个结构sizeof后是44字节,而不是41字节,切记.否则用PHP转成的结构C语言是解析不了的.<br/><br/>------------------------------------------------<br/><br/>/*server.c*/<br/>#include &lt;sys/types.h&gt;<br/>#include &lt;sys/socket.h&gt;<br/>#include &lt;string.h&gt;<br/>#include &lt;stdio.h&gt;<br/>#include &lt;netinet/in.h&gt;<br/>#include &lt;arpa/inet.h&gt;<br/>#include &lt;stdlib.h&gt;<br/>#include &lt;unistd.h&gt;<br/>#include &lt;errno.h&gt;<br/><br/>main()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int sock;<br/>&nbsp;&nbsp;&nbsp;&nbsp; struct sockaddr_in server,client;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int recvd,snd;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int structlength;<br/>&nbsp;&nbsp;&nbsp;&nbsp; char * server_ip = &quot;128.168.10.1&quot;;/*server ip address*/<br/>&nbsp;&nbsp;&nbsp;&nbsp; int port = 8888;<br/>&nbsp;&nbsp;&nbsp;&nbsp; char recvbuf[2000],sendbuf[2000];&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; char str1[]=&quot;I have received:&#92;n&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; memset((char *)&amp;server,0,sizeof(server));<br/>&nbsp;&nbsp;&nbsp;&nbsp; server.sin_family = AF_INET;<br/>&nbsp;&nbsp;&nbsp;&nbsp; server.sin_addr.s_addr = inet_addr(server_ip);<br/>&nbsp;&nbsp;&nbsp;&nbsp; server.sin_port = htons(port);<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; memset((char *)&amp;client,0,sizeof(client));<br/>&nbsp;&nbsp;&nbsp;&nbsp; client.sin_family = AF_INET;<br/>&nbsp;&nbsp;&nbsp;&nbsp; client.sin_addr.s_addr = htonl(INADDR_ANY);<br/>&nbsp;&nbsp;&nbsp;&nbsp; client.sin_port = htons(port);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; if((sock = socket (AF_INET,SOCK_DGRAM,0)) &lt; 0 )&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;socket create error!&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; structlength = sizeof(server);<br/>&nbsp;&nbsp;&nbsp;&nbsp; if( bind(sock,(struct sockaddr *) &amp;server,structlength) &lt; 0)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;socket bind error!&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror(&quot;bind&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; while(1)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; structlength = sizeof(client);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;waiting.......&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recvd = recvfrom(sock,recvbuf,sizeof(recvbuf),0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (struct sockaddr *) &amp; client,&amp;structlength);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(recvd &lt; 0)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror(&quot;recvfrom&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(EXIT_FAILURE);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;received:%s&#92;n&quot;,recvbuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(sendbuf,0,strlen(sendbuf));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(sendbuf,str1,strlen(str1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snd = sendto(sock,sendbuf,strlen(str1),0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (struct sockaddr *) &amp;client,structlength);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(snd &lt; 0)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror(&quot;sendto&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;sendok!&#92;n&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; close(sock);<br/>&#125;<br/>/*<br/>gcc -o server server.c生成server程序，在服务器端运行./server<br/>*/<br/><br/><br/>/*client.php*/<br/><br/>&lt;?php<br/>$server_ip=&quot;128.168.10.1&quot;;<br/>$port = 8888;<br/><br/>$sock=@socket_create(AF_INET,SOCK_DGRAM,0);<br/><br/>if(!$sock)&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;socket create failure&quot;;<br/><br/>&#125;<br/><br/>if($buf==&quot;&quot;)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; $buf=&quot;hello,how are you!&#92;n&quot;;<br/><br/>if(!@socket_sendto($sock,$buf,strlen($buf),0,&quot;128.168.10.1&quot;,8888))&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;send error&#92;n&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; socket_close($sock);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; exit();<br/><br/>&#125;<br/><br/><br/><br/>$buf=&quot;&quot;;<br/>$msg=&quot;&quot;;<br/><br/>if(!@socket_recvfrom($sock,$msg,256,0,&amp;$server_ip,&amp;$port))&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;recvieve error!&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; socket_close($sock);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; exit();<br/><br/>&#125;<br/><br/>echo trim($msg).&quot;&#92;n&quot;;<br/><br/>socket_close($sock);<br/><br/>?&gt;<br/>&lt;form action=&quot;client.php&quot; method=&quot;post&quot;&gt;<br/>&lt;input type=text name=buf&gt;<br/>&lt;input type=submit value=&quot;submit&quot;&gt;<br/>&lt;/form&gt;<br/><br/>/*这个过程很简单，就是客户端提交一个信息，服务端接收，<br/>并返回给客户端一个&quot;接收到&quot;的确认信息。<br/>*/<br/><br/>--------------------------------------------------------<br/><br/>&lt;?<br/>// 设置一些基本的变量<br/>$host = &quot;192.168.1.99&quot;;<br/>$port = 1234;<br/>// 设置超时时间<br/>set_time_limit(0);<br/>// 创建一个Socket<br/>$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die(&quot;Could not create<br/>socket&#92;n&quot;);<br/>//绑定Socket到端口<br/>$result = socket_bind($socket, $host, $port) or die(&quot;Could not bind to<br/>socket&#92;n&quot;);<br/>// 开始监听链接<br/>$result = socket_listen($socket, 3) or die(&quot;Could not set up socket<br/>listener&#92;n&quot;);<br/>// accept incoming connections<br/>// 另一个Socket来处理通信<br/>$spawn = socket_accept($socket) or die(&quot;Could not accept incoming<br/>connection&#92;n&quot;);<br/>// 获得客户端的输入<br/>$input = socket_read($spawn, 1024) or die(&quot;Could not read input&#92;n&quot;);<br/>// 清空输入字符串<br/>$input = trim($input);<br/>//处理客户端输入并返回结果<br/>$output = strrev($input) . &quot;&#92;n&quot;;<br/>socket_write($spawn, $output, strlen ($output)) or die(&quot;Could not write<br/>output&#92;n&quot;);<br/>// 关闭sockets<br/>socket_close($spawn);<br/>socket_close($socket);<br/>?&gt;<br/><br/>--------------------------------------<br/><br/>socket_accept() 接受一个Socket连接<br/>socket_bind() 把socket绑定在一个IP地址和端口上<br/>socket_clear_error() 清除socket的错误或者最后的错误代码<br/>socket_close() 关闭一个socket资源<br/>socket_connect() 开始一个socket连接<br/>socket_create_listen() 在指定端口打开一个socket监听<br/>socket_create_pair() 产生一对没有区别的socket到一个数组里<br/>socket_create() 产生一个socket，相当于产生一个socket的数据结构<br/>socket_get_option() 获取socket选项<br/>socket_getpeername() 获取远程类似主机的ip地址<br/>socket_getsockname() 获取本地socket的ip地址<br/>socket_iovec_add() 添加一个新的向量到一个分散/聚合的数组<br/>socket_iovec_alloc() 这个函数创建一个能够发送接收读写的iovec数据结构<br/>socket_iovec_delete() 删除一个已经分配的iovec<br/>socket_iovec_fetch() 返回指定的iovec资源的数据<br/>socket_iovec_free() 释放一个iovec资源<br/>socket_iovec_set() 设置iovec的数据新值<br/>socket_last_error() 获取当前socket的最后错误代码<br/>socket_listen() 监听由指定socket的所有连接<br/>socket_read() 读取指定长度的数据<br/>socket_readv() 读取从分散/聚合数组过来的数据<br/>socket_recv() 从socket里结束数据到缓存<br/>socket_recvfrom() 接受数据从指定的socket，如果没有指定则默认当前socket<br/>socket_recvmsg() 从iovec里接受消息<br/>socket_select() 多路选择<br/>socket_send() 这个函数发送数据到已连接的socket<br/>socket_sendmsg() 发送消息到socket<br/>socket_sendto() 发送消息到指定地址的socket<br/>socket_set_block() 在socket里设置为块模式<br/>socket_set_nonblock() socket里设置为非块模式<br/>socket_set_option() 设置socket选项<br/>socket_shutdown() 这个函数允许你关闭读、写、或者指定的socket<br/>socket_strerror() 返回指定错误号的详细错误<br/>socket_write() 写数据到socket缓存<br/>socket_writev() 写数据到分散/聚合数组<br/><br/><br/>PHP socket 编程中的超时设置，网上找了半天也没找到，贴出来分享之。<br/><br/>设置$socket 发送超时1秒，接收超时3秒：<br/><br/>$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);<br/>socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array(&quot;sec&quot;=&gt;1, &quot;usec&quot;=&gt;0 ) );<br/>socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array(&quot;sec&quot;=&gt;3, &quot;usec&quot;=&gt;0 ) );<br/><br/>
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 关于php和C语言接口的结构传递问题,udp，tcp通信]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>