zhr811022 发表于 2011-12-20 09:47

udp编译模型-- 基于tcp上二次开发

<DIV>#include &lt;string.h&gt;<BR>#include &lt;stdio.h&gt;<BR>#include &lt;stdlib.h&gt;<BR>#include &lt;winsock2.h&gt;</DIV>
<DIV><BR>#include "msinc.h"<BR>#include "mssoc.h"<BR>#include "mslog.h"<BR>#include "mssim.h"</DIV>
<DIV>#define sm_set_core_flag()<BR>#define sm_set_app_flag()</DIV>
<DIV>/* -------------------------------------------------------------------------- <BR>&nbsp;* 模块内部变量声明。<BR>&nbsp;* ----------------------------------------------------------------------- */<BR>typedef struct _soc_session_t {<BR>&nbsp;int used;<BR>&nbsp;int handle;<BR>&nbsp;SOCKET socket;<BR>&nbsp;enum {TCP_CONNECTING, TCP_CONNECTED, TCP_WAIT_CLOSE} tcp_state;<BR>&nbsp;enum {UDP_CONNECTING, UDP_CONNECTED, UDP_WAIT_CLOSE} udp_state;<BR>&nbsp;enum {BLOCK_WRITE, CAN_WRITE} write_pipe;<BR>&nbsp;enum {BLOCK_READ, CAN_READ} read_pipe;<BR>&nbsp;//void (*hook)(int handler, int state);<BR>&nbsp;ms_sockaddr addr;<BR>&nbsp;ms_get_host_cb_t get_host_cb;<BR>&nbsp;ms_soc_cb_t soc_cb;<BR>} soc_session_t;<BR>#define MS_SOC_MAX_NUM (3)<BR>/**<BR>&nbsp;* 并发TCP会话队列。<BR>&nbsp;*/<BR>static soc_session_t sessions;</DIV>
<DIV>/*<BR>&nbsp;* 队列定时器初始化标志。<BR>&nbsp;*/<BR>static int init_timer = 0;</DIV>
<DIV>/*<BR>&nbsp;* 定时器的ID号。<BR>&nbsp;*/<BR>static int itemer_id = -1;</DIV>
<DIV>/*<BR>&nbsp;* 系统忙标志。<BR>&nbsp;*/<BR>static int busy = 0;</DIV>
<DIV>/* -------------------------------------------------------------------------- <BR>&nbsp;* 模块内部函数声明。<BR>&nbsp;* ----------------------------------------------------------------------- */</DIV>
<DIV>/**<BR>&nbsp;* TCP队列处理定时器函数。<BR>&nbsp;*/<BR>static void proc_sessions(int tid, int p);</DIV>
<DIV>/**<BR>&nbsp;* 处理会话。<BR>&nbsp;*/<BR>static void proc_session(soc_session_t* session);</DIV>
<DIV>/**<BR>&nbsp;* tcp模块的初始化函数。<BR>&nbsp;*/<BR>static int soc_mod_init_func(void);</DIV>
<DIV>/**<BR>&nbsp;* tcp模块的清理函数。<BR>&nbsp;*/<BR>static int soc_mod_fina_func(void);</DIV>
<DIV>static int soc_mod_init_func(void)<BR>{&nbsp;<BR>&nbsp;WSADATA ws;<BR>&nbsp;int ret = -1;</DIV>
<DIV>&nbsp;ret = WSAStartup(MAKEWORD(1, 1), &amp;ws);<BR>&nbsp;if (ret != 0)<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;else <BR>&nbsp;{<BR>&nbsp;&nbsp;itemer_id = -1;<BR>&nbsp;&nbsp;init_timer = 0;&nbsp;<BR>&nbsp;}</DIV>
<DIV>&nbsp;return 0;<BR>}</DIV>
<DIV>static int soc_mod_fina_func(void)<BR>{<BR>&nbsp;WSACleanup();</DIV>
<DIV>&nbsp;if (init_timer &amp;&amp; itemer_id &gt;= 0)<BR>&nbsp;{<BR>&nbsp;&nbsp;ms_delete_timer((uint16)itemer_id);<BR>&nbsp;&nbsp;itemer_id = -1;<BR>&nbsp;&nbsp;init_timer = 0;<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;return 0;<BR>}</DIV>
<DIV>void proc_session(soc_session_t* session) {<BR>&nbsp;int v;<BR>&nbsp;fd_set fdrds, fdwrs;<BR>&nbsp;struct timeval timeout = {0, 0};</DIV>
<DIV>&nbsp;if (!init_timer)<BR>&nbsp;&nbsp;return;<BR>&nbsp;<BR>&nbsp;switch(session-&gt;tcp_state) <BR>&nbsp;{<BR>&nbsp;case TCP_CONNECTING:<BR>&nbsp;&nbsp;FD_ZERO(&amp;fdwrs);<BR>&nbsp;&nbsp;FD_SET(session-&gt;socket, &amp;fdwrs);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if ((v = select(1, NULL, &amp;fdwrs, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;if (session-&gt;soc_cb)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_app_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;soc_cb(session-&gt;handle, MS_SOCEVT_CONNECT_FAILED);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_core_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if (v &gt; 0 &amp;&amp; FD_ISSET(session-&gt;socket, &amp;fdwrs)) <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;session-&gt;tcp_state = TCP_CONNECTED;<BR>&nbsp;&nbsp;&nbsp;session-&gt;read_pipe = CAN_READ;<BR>&nbsp;&nbsp;&nbsp;session-&gt;write_pipe = CAN_WRITE;<BR>&nbsp;&nbsp;&nbsp;if (session-&gt;soc_cb)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_app_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;soc_cb(session-&gt;handle, MS_SOCEVT_CONNECT);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_core_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;break;<BR>&nbsp;case TCP_CONNECTED:<BR>&nbsp;&nbsp;if (session-&gt;write_pipe == BLOCK_WRITE)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;FD_ZERO(&amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;FD_SET(session-&gt;socket, &amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if ((v = select(1, NULL, &amp;fdwrs, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (session-&gt;soc_cb)<BR>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_app_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;soc_cb(session-&gt;handle, MS_SOCEVT_CONNECT_FAILED);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_core_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if (v &gt; 0 &amp;&amp; FD_ISSET(session-&gt;socket, &amp;fdwrs)) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;write_pipe = CAN_WRITE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (session-&gt;soc_cb)<BR>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_app_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;soc_cb(session-&gt;handle, MS_SOCEVT_WRITE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_core_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;FD_ZERO(&amp;fdrds);<BR>&nbsp;&nbsp;FD_SET(session-&gt;socket, &amp;fdrds);<BR>&nbsp;&nbsp;if ((v = select(1, &amp;fdrds, NULL, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;if (session-&gt;soc_cb)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_app_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;soc_cb(session-&gt;handle, MS_SOCEVT_CONNECT_FAILED);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_core_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if ((v &gt; 0) &amp;&amp; FD_ISSET(session-&gt;socket, &amp;fdrds)) <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;session-&gt;read_pipe = CAN_READ;<BR>&nbsp;&nbsp;&nbsp;if (session-&gt;soc_cb)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_app_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;soc_cb(session-&gt;handle, MS_SOCEVT_READ);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_core_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;}<BR>&nbsp;<BR>&nbsp;&nbsp;break;<BR>&nbsp;case TCP_WAIT_CLOSE:<BR>&nbsp;&nbsp;if (session-&gt;soc_cb)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_app_flag();<BR>&nbsp;&nbsp;&nbsp;session-&gt;soc_cb(session-&gt;handle, MS_SOCEVT_CLOSE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm_set_core_flag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;session-&gt;used = FALSE;<BR>&nbsp;&nbsp;session-&gt;soc_cb = NULL;<BR>&nbsp;&nbsp;break;<BR>&nbsp;}&nbsp;<BR>}</DIV>
<DIV><BR>void proc_sessions(int tid, int p) {<BR>&nbsp;int i;</DIV>
<DIV>&nbsp;if (busy)<BR>&nbsp;&nbsp;return ;</DIV>
<DIV>&nbsp;busy = TRUE;</DIV>
<DIV>&nbsp;for (i = 0; i &lt; MS_SOC_MAX_NUM; i++) {<BR>&nbsp;&nbsp;if (sessions.used) {<BR>&nbsp;&nbsp;&nbsp;proc_session(sessions + i);<BR>&nbsp;&nbsp;}<BR>&nbsp;}</DIV>
<DIV>&nbsp;busy = FALSE;<BR>}</DIV>
<DIV><BR>/************************************************************************************/<BR>//mssoc.h</DIV>
<DIV>int bearer_mode;<BR>int bearer_status;<BR>ms_bearer_cb_t bearer_cb;</DIV>
<DIV>int ms_soc_init()<BR>{<BR>&nbsp;soc_mod_init_func();</DIV>
<DIV>&nbsp;if (bearer_status)<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;if (!init_timer) <BR>&nbsp;{<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;memset(&amp;sessions, 0, sizeof(sessions));<BR>&nbsp;&nbsp;//ms_quick_timer(200, 0, proc_sessions, 1);<BR>&nbsp;&nbsp;ms_quick_timer(1000,0, proc_sessions,1);<BR>&nbsp;&nbsp;init_timer = TRUE;<BR>&nbsp;}</DIV>
<DIV>&nbsp;return 0;<BR>}</DIV>
<DIV>int ms_soc_finalize()<BR>{<BR>&nbsp;if (bearer_status)<BR>&nbsp;&nbsp;ms_bearer_close();</DIV>
<DIV>&nbsp;soc_mod_fina_func();<BR>&nbsp;return 0;<BR>}</DIV>
<DIV>static void bearer_timer_cb(int tid, int p)<BR>{<BR>&nbsp;if (bearer_cb)<BR>&nbsp;{<BR>&nbsp;&nbsp;if (!p)<BR>&nbsp;&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;bearer_status = 1;<BR>&nbsp;&nbsp;&nbsp;bearer_cb(MS_BEARER_OK);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;bearer_status = 0;<BR>&nbsp;&nbsp;&nbsp;//bearer_cb(MS_BEARER_FAILED);<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}<BR>int ms_bearer_open(int mode, void * cb)<BR>{<BR>&nbsp;if (!bearer_status)<BR>&nbsp;{<BR>&nbsp;&nbsp;ms_quick_timer(2000, 0, bearer_timer_cb, 0);<BR>&nbsp;&nbsp;bearer_mode = mode;<BR>&nbsp;&nbsp;bearer_cb = cb;<BR>&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;}<BR>&nbsp;return MS_SOC_OK;<BR>}</DIV>
<DIV>int ms_bearer_close()<BR>{<BR>&nbsp;if (bearer_status)<BR>&nbsp;{<BR>&nbsp;&nbsp;ms_quick_timer(2000, 1, bearer_timer_cb, 0);<BR>&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;}<BR>&nbsp;return MS_SOC_OK;<BR>}</DIV>
<DIV>void * _vm_soc_session_malloc()<BR>{<BR>&nbsp;int i;<BR>&nbsp;soc_session_t* session = NULL;<BR>&nbsp;for (i = 0; i &lt; MS_SOC_MAX_NUM; i++) <BR>&nbsp;{<BR>&nbsp;&nbsp;if (!sessions.used) {<BR>&nbsp;&nbsp;&nbsp;session = sessions + i;<BR>&nbsp;&nbsp;&nbsp;session-&gt;handle = i;<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;}&nbsp;<BR>&nbsp;return session;<BR>}<BR>void _ms_soc_session_free(int handle)<BR>{<BR>&nbsp;&nbsp;&nbsp; if (handle &gt;= 0 &amp;&amp; handle &lt;= MS_SOC_MAX_NUM)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessions.tcp_state = TCP_WAIT_CLOSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessions.used = FALSE;<BR>&nbsp;&nbsp;sessions.soc_cb = NULL;<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>void * _ms_soc_session_get(int handle)<BR>{<BR>&nbsp;return sessions+handle;<BR>}<BR>int ms_soc_create(int type, void * cb)<BR>{<BR>&nbsp;soc_session_t* session;</DIV>
<DIV>&nbsp;session = _vm_soc_session_malloc();<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;unsigned long ul = 1;<BR>&nbsp;&nbsp;unsigned long p = 0;<BR>&nbsp;&nbsp;session-&gt;tcp_state = TCP_CONNECTING;<BR>&nbsp;&nbsp;session-&gt;used = TRUE;<BR>&nbsp;&nbsp;session-&gt;soc_cb = cb;</DIV>
<DIV>&nbsp;&nbsp;if ((session-&gt;socket = socket(PF_INET, type+1, 0)) == INVALID_SOCKET)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;_ms_soc_session_free(session-&gt;handle);<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;}</DIV>
<DIV>&nbsp;&nbsp;if(ioctlsocket(session-&gt;socket, FIONBIO, (unsigned long*)&amp;ul) == SOCKET_ERROR)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;_ms_soc_session_free(session-&gt;handle);<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;}</DIV>
<DIV>&nbsp;&nbsp;if (ioctlsocket(session-&gt;socket, FIONREAD, &amp;p) != 0)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;_ms_soc_session_free(session-&gt;handle);<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;}</DIV>
<DIV>&nbsp;&nbsp;return session-&gt;handle;<BR>&nbsp;}<BR>&nbsp;return MS_SOC_USEOUT;<BR>}</DIV>
<DIV>//////////////////////////////////////////////////////<BR>int ms_soc_create_udp(int type, void * cb)</DIV>
<DIV>{<BR>&nbsp;soc_session_t* session;<BR>&nbsp;<BR>&nbsp;session = _vm_soc_session_malloc();<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;unsigned long ul = 1;<BR>&nbsp;&nbsp;unsigned long p = 0;<BR>&nbsp;&nbsp;session-&gt;udp_state = UDP_CONNECTING;<BR>&nbsp;&nbsp;session-&gt;used = TRUE;<BR>&nbsp;&nbsp;session-&gt;soc_cb = cb;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if ((session-&gt;socket = socket(PF_INET, type, 0)) == INVALID_SOCKET)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;_ms_soc_session_free(session-&gt;handle);<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if(ioctlsocket(session-&gt;socket, FIONBIO, (unsigned long*)&amp;ul) == SOCKET_ERROR)//控制套接口的模式<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;_ms_soc_session_free(session-&gt;handle);<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if (ioctlsocket(session-&gt;socket, FIONREAD, &amp;p) != 0)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;_ms_soc_session_free(session-&gt;handle);<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;return session-&gt;handle;<BR>&nbsp;}<BR>&nbsp;return MS_SOC_USEOUT;<BR>}</DIV>
<DIV>int ms_soc_close(int s)<BR>{<BR>&nbsp;int handle = s;<BR>&nbsp;if ((handle &gt;= 0) &amp;&amp; (handle &lt; MS_SOC_MAX_NUM)) <BR>&nbsp;{<BR>&nbsp;&nbsp;if (sessions.handle == handle) <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;closesocket(sessions.socket);<BR>&nbsp;&nbsp;&nbsp;_ms_soc_session_free(handle);</DIV>
<DIV>&nbsp;&nbsp;&nbsp;return MS_SOC_OK;<BR>&nbsp;&nbsp;}<BR>&nbsp;}&nbsp;</DIV>
<DIV>&nbsp;return MS_SOC_INVALID;<BR>}</DIV>
<DIV>int ms_soc_bind(int s, ms_sockaddr * addr)<BR>{<BR>&nbsp;int handle,err;<BR>//&nbsp;int&nbsp;len;<BR>&nbsp;soc_session_t* session;<BR>&nbsp;struct sockaddr_in udp_bind;//标准的套接字结构体sockaddr_in<BR>&nbsp;ms_sockaddr *addr_udp=NULL;<BR>&nbsp;addr_udp=addr;<BR>&nbsp;handle=s;<BR>&nbsp;session = _ms_soc_session_get(s);//return sessions+handle;返回的应该是socket的值<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;udp_bind.sin_family = AF_INET;<BR>&nbsp;&nbsp;udp_bind.sin_port = htons((unsigned short)addr-&gt;port);<BR>&nbsp;&nbsp;udp_bind.sin_addr.s_addr = *(long*)addr-&gt;addr;<BR>&nbsp;<BR>&nbsp;}</DIV>
<DIV>&nbsp;if ((handle &gt;= 0) &amp;&amp; (handle &lt; MS_SOC_MAX_NUM)) <BR>&nbsp;{<BR>&nbsp;&nbsp;if (sessions.handle == handle) <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;err=bind(s,(struct sockaddr *)&amp;addr,sizeof(addr));<BR>&nbsp;&nbsp;&nbsp;if(err==SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;return MS_SOC_OK;<BR>&nbsp;&nbsp;}<BR>&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;return 0;<BR>}</DIV>
<DIV><BR>int ms_soc_connect(int s, const ms_sockaddr * addr)<BR>{<BR>&nbsp;int idx = -1;<BR>&nbsp;soc_session_t* session;<BR>&nbsp;struct sockaddr_in remote;<BR>&nbsp;unsigned long p = 0;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; int TimeOut = 5000;<BR>&nbsp;&nbsp;&nbsp; unsigned long ul = 1;<BR>&nbsp;&nbsp;&nbsp; struct timeval timeout;<BR>&nbsp;&nbsp;&nbsp; fd_set r;<BR>&nbsp;&nbsp;&nbsp; int ret;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;session = _ms_soc_session_get(s);<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;remote.sin_family = AF_INET;<BR>&nbsp;&nbsp;remote.sin_port = htons((unsigned short)addr-&gt;port);<BR>&nbsp;&nbsp;remote.sin_addr.s_addr = *(long*)addr-&gt;addr;</DIV>
<DIV>&nbsp;&nbsp;if (connect(session-&gt;socket, (struct sockaddr*)&amp;remote, sizeof(remote)) == SOCKET_ERROR)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;if (WSAGetLastError() == WSAEWOULDBLOCK)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int error_code, err_len=sizeof(error_code);<BR>&nbsp;&nbsp;&nbsp;&nbsp;FD_ZERO(&amp;r);<BR>&nbsp;&nbsp;&nbsp;&nbsp;FD_SET(session-&gt;socket, &amp;r);<BR>&nbsp;&nbsp;&nbsp;&nbsp;timeout.tv_sec = 10;&nbsp;&nbsp; //Connection timeout<BR>&nbsp;&nbsp;&nbsp;&nbsp;timeout.tv_usec = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ret = select(session-&gt;socket+1, 0, &amp;r, 0, &amp;timeout);</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;if ( ret &lt;= 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = closesocket(session-&gt;socket);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ms_soc_session_free(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;if (FD_ISSET(session-&gt;socket, &amp;r))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getsockopt(session-&gt;socket, SOL_SOCKET, SO_ERROR, (char *)&amp;error_code, &amp;err_len);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (error_code != 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = closesocket(session-&gt;socket);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ms_soc_session_free(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = closesocket(session-&gt;socket);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ms_soc_session_free(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;_ms_soc_session_free(idx);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if(ioctlsocket(session-&gt;socket, FIONBIO, (unsigned long*)&amp;p) == SOCKET_ERROR)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;closesocket(session-&gt;socket);<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;return MS_SOC_INVALID;<BR>}</DIV>
<DIV>int ms_soc_recvfrom(int s,void *buf,int len,ms_sockaddr *addr)<BR>{<BR>&nbsp;int handle = s;<BR>&nbsp;int nread;<BR>&nbsp;int serverlen;<BR>&nbsp;//int v;<BR>//&nbsp;fd_set fdwrs_udp;<BR>&nbsp;struct timeval timeout = {0, 0};<BR>&nbsp;soc_session_t* session;<BR>&nbsp;<BR>&nbsp;struct sockaddr_in remote_udp;//标准的套接字结构体sockaddr_in<BR>&nbsp;ms_sockaddr *addr_udp=NULL;<BR>&nbsp;addr_udp=addr;//接收下看看<BR>&nbsp;serverlen=sizeof(remote_udp);<BR>&nbsp;//sessions.write_pipe =CAN_WRITE;<BR>&nbsp;session = _ms_soc_session_get(s);//return sessions+handle;返回的应该是socket的值<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;//把自己定义的放到标准的里边<BR>&nbsp;&nbsp;remote_udp.sin_family = AF_INET;<BR>&nbsp;&nbsp;remote_udp.sin_port = htons((unsigned short)addr-&gt;port);<BR>&nbsp;&nbsp;remote_udp.sin_addr.s_addr = *(long*)addr-&gt;addr;//是否正确???<BR>&nbsp;&nbsp;//sockSend.sin_addr.S_un.S_addr=inet_addr("211.143.108.24");//服务器地址??传递是否正确<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;handle=s;//接收句柄<BR>&nbsp;/*<BR>&nbsp;if ((handle &gt;= 0) &amp;&amp; (handle &lt; MS_SOC_MAX_NUM) &amp;&amp; <BR>&nbsp;&nbsp;sessions.used &amp;&amp; (sessions.handle == handle))<BR>&nbsp;{<BR>&nbsp;&nbsp;if (sessions.udp_state == UDP_WAIT_CLOSE)<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;*/<BR>&nbsp;&nbsp;nread = recvfrom(sessions.socket, (char*)buf, len, 0,(struct sockaddr*)&amp;remote_udp,&amp;serverlen);<BR>/*<BR>&nbsp;&nbsp;if (sessions.read_pipe == CAN_READ <BR>&nbsp;&nbsp;&nbsp;&amp;&amp; sessions.udp_state == UDP_CONNECTED)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;int v;<BR>&nbsp;&nbsp;&nbsp;fd_set fdwrs;<BR>&nbsp;&nbsp;&nbsp;struct timeval timeout = {0, 0};<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;FD_ZERO(&amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;FD_SET(sessions.socket, &amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if ((v = select(1, &amp;fdwrs, NULL, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if (v &gt; 0 &amp;&amp; FD_ISSET(sessions.socket, &amp;fdwrs)) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;nread = recvfrom(sessions.socket, (char*)buf, len, 0,(struct sockaddr*)addr,(int *)sizeof(ms_sockaddr));<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;</DIV>
<DIV>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;* nread == 0 表示TCP链路已经被对等层关闭。<BR>&nbsp;&nbsp;&nbsp;* SOCKET_ERROR 并且调用WSAGetLastError()返回WSAEWOULDBLOCK写通道当前被阻塞,其他为失败。<BR>&nbsp;&nbsp;&nbsp;* nread &gt; 0表示已经写入了一定的字节数。<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if (nread == 0)&nbsp;<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//收到Server的FIN包,可以选择主动断开连接或继续发送数据;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//ms_soc_close(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//nread = -1;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;else if (nread == SOCKET_ERROR)&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;switch(WSAGetLastError())<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;case WSAEWOULDBLOCK:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessions.read_pipe = BLOCK_READ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nread = MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nread = -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return nread;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;}&nbsp;<BR>&nbsp;else<BR>&nbsp;&nbsp;return MS_SOC_INVALID;<BR>&nbsp;&nbsp;*/<BR>&nbsp;&nbsp;return nread;<BR>}</DIV>
<DIV><BR>int ms_soc_recv(int s, void * buf, int len)<BR>{<BR>&nbsp;int handle = s;<BR>&nbsp;int nread;<BR>&nbsp;<BR>&nbsp;if ((handle &gt;= 0) &amp;&amp; (handle &lt; MS_SOC_MAX_NUM) &amp;&amp; <BR>&nbsp;&nbsp;sessions.used &amp;&amp; (sessions.handle == handle)) <BR>&nbsp;{<BR>&nbsp;&nbsp;if (sessions.tcp_state == TCP_WAIT_CLOSE)<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if (sessions.read_pipe == CAN_READ <BR>&nbsp;&nbsp;&nbsp;&amp;&amp; sessions.tcp_state == TCP_CONNECTED)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;/***************************************/<BR>&nbsp;&nbsp;&nbsp;int v;<BR>&nbsp;&nbsp;&nbsp;fd_set fdwrs;<BR>&nbsp;&nbsp;&nbsp;struct timeval timeout = {0, 0};<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;FD_ZERO(&amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;FD_SET(sessions.socket, &amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if ((v = select(1, &amp;fdwrs, NULL, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if (v &gt; 0 &amp;&amp; FD_ISSET(sessions.socket, &amp;fdwrs)) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;nread = recv(sessions.socket, (char*)buf, len, 0);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;/***************************************/</DIV>
<DIV>&nbsp;&nbsp;&nbsp;/*<BR>&nbsp;&nbsp;&nbsp;* nread == 0 表示TCP链路已经被对等层关闭。<BR>&nbsp;&nbsp;&nbsp;* SOCKET_ERROR 并且调用WSAGetLastError()返回WSAEWOULDBLOCK写通道当前被阻塞,其他为失败。<BR>&nbsp;&nbsp;&nbsp;* nread &gt; 0表示已经写入了一定的字节数。<BR>&nbsp;&nbsp;&nbsp;*/<BR>&nbsp;&nbsp;&nbsp;if (nread == 0)&nbsp;<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//收到Server的FIN包,可以选择主动断开连接或继续发送数据;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//ms_soc_close(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//nread = -1;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;else if (nread == SOCKET_ERROR)&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;switch(WSAGetLastError())<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;case WSAEWOULDBLOCK:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessions.read_pipe = BLOCK_READ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nread = MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nread = -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return nread;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;&nbsp;return MS_SOC_INVALID;</DIV>
<DIV>}<BR>/***************************************************************************************************************************************************************************<BR>*具体解释 select 的参数:</DIV>
<DIV>&nbsp;&nbsp;&nbsp; int maxfdp 是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在 Windows 中这个参数值无所谓,可以设置不正确。</DIV>
<DIV>&nbsp;&nbsp;&nbsp; fd_set* readfds 是指向 fd_set 结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select 就会返回一个大于 0 的值,表示可读取的文件数量,如果没有可读的文件,则根据 timeout 参数再判断是否超时,若超出 timeout 的时间,select 返回 0,若发生错误返回负值。这个参数也可以传入 NULL 值,表示不关心任何文件的读变化。</DIV>
<DIV>&nbsp;&nbsp;&nbsp; fd_set* writefds 是指向 fd_set 结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select 就会返回一个大于 0 的值,表示可写入的文件数量,如果没有可写的文件,则根据 timeout 参数再判断是否超时,若超出 timeout 的时间,select 返回 0,若发生错误返回负值。这个参数也可以传入 NULL值,表示不关心任何文件的写变化。</DIV>
<DIV>&nbsp;&nbsp;&nbsp; fe_set* errorfds 同上面两个参数的一样,用来监视文件错误异常。</DIV>
<DIV>&nbsp;&nbsp;&nbsp; struct timeval* timeout 是 select 的超时时间,这个参数至关重要,它可以使 select 处于三种状态。</DIV>
<DIV>&nbsp;&nbsp;&nbsp; 第一:若将 NULL 以形参传入,即不传入时间结构,就是将 select 置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; 第二:若将时间值设为 0 秒 0 微妙,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回 0,有变化返回一个正值;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; 第三:timeout 的值大于 0,这就是等待的超时时间,即 select 在 timeout 时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。&nbsp;&nbsp;<BR>**************************************************************************************************************************************************************************/</DIV>
<DIV>int ms_soc_sendto(int s,const void *buf,int len,ms_sockaddr *addr)<BR>{<BR>&nbsp;int handle;<BR>&nbsp;int nwrite;<BR>//&nbsp;int v;<BR>//&nbsp;fd_set fdwrs_udp;<BR>&nbsp;struct timeval timeout = {0, 0};<BR>&nbsp;soc_session_t* session;<BR>&nbsp;<BR>&nbsp;struct sockaddr_in remote_udp;//标准的套接字结构体sockaddr_in<BR>&nbsp;ms_sockaddr *addr_udp=NULL;<BR>&nbsp;addr_udp=addr;//接收下看看<BR>&nbsp;//sessions.write_pipe =CAN_WRITE;<BR>&nbsp;session = _ms_soc_session_get(s);//return sessions+handle;返回的应该是socket的值<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;//把自己定义的放到标准的里边<BR>&nbsp;&nbsp;remote_udp.sin_family = AF_INET;<BR>&nbsp;&nbsp;remote_udp.sin_port = htons((unsigned short)addr-&gt;port);<BR>&nbsp;&nbsp;remote_udp.sin_addr.s_addr = *(long*)addr-&gt;addr;//是否正确???<BR>&nbsp;&nbsp;//sockSend.sin_addr.S_un.S_addr=inet_addr("211.143.108.24");//服务器地址??传递是否正确<BR>&nbsp;}</DIV>
<DIV>&nbsp;handle=s;//接收句柄<BR>&nbsp;<BR>&nbsp;/*<BR>&nbsp;<BR>&nbsp;FD_ZERO(&amp;fdwrs_udp);<BR>&nbsp;FD_SET(sessions.socket, &amp;fdwrs_udp);<BR>&nbsp;<BR>&nbsp;if ((v = select(1, NULL, &amp;fdwrs_udp, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;{<BR>&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;}<BR>&nbsp;*/<BR>&nbsp;nwrite = sendto(sessions.socket, (char*)buf, len, 0,(struct sockaddr*)&amp;remote_udp,sizeof(remote_udp));<BR>&nbsp;/*<BR>&nbsp;if (v &gt; 0 &amp;&amp; FD_ISSET(sessions.socket, &amp;fdwrs_udp)) <BR>&nbsp;{<BR>&nbsp;&nbsp;nwrite = sendto(sessions.socket, (char*)buf, len, 0,(struct sockaddr*)&amp;remote_udp,sizeof(remote_udp));<BR>&nbsp;&nbsp;//标准sendto改变<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;*/<BR>&nbsp;/*<BR>&nbsp;if ((handle &gt;= 0) &amp;&amp; (handle &lt; MS_SOC_MAX_NUM) &amp;&amp; <BR>&nbsp;&nbsp;sessions.used &amp;&amp; (sessions.handle == handle))//用于并发事件判断&nbsp;<BR>&nbsp;{</DIV>
<DIV>&nbsp;&nbsp;if (sessions.udp_state == UDP_WAIT_CLOSE)//状态判断<BR>&nbsp;&nbsp;&nbsp;return -1;</DIV>
<DIV>&nbsp;//&nbsp;if (sessions.write_pipe == CAN_WRITE<BR>&nbsp;//&nbsp;&nbsp;&amp;&amp; sessions.udp_state == UDP_CONNECTED)//写入状态判断<BR>&nbsp;//&nbsp;{</DIV>
<DIV>&nbsp;&nbsp;&nbsp;int v;<BR>&nbsp;&nbsp;&nbsp;fd_set fdwrs_udp;<BR>&nbsp;&nbsp;&nbsp;struct timeval timeout = {0, 0};<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;FD_ZERO(&amp;fdwrs_udp);<BR>&nbsp;&nbsp;&nbsp;FD_SET(sessions.socket, &amp;fdwrs_udp);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if ((v = select(1, NULL, &amp;fdwrs_udp, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;}</DIV>
<DIV><BR>&nbsp;&nbsp;&nbsp;if (v &gt; 0 &amp;&amp; FD_ISSET(sessions.socket, &amp;fdwrs_udp)) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;nwrite = sendto(sessions.socket, (char*)buf, len, 0,(struct sockaddr*)&amp;remote_udp,sizeof(remote_udp));<BR>&nbsp;&nbsp;&nbsp;&nbsp;//标准sendto改变<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;/* 单独错误处理<BR>&nbsp;&nbsp;&nbsp;if (nwrite == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;switch(WSAGetLastError())<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;case WSAEWOULDBLOCK:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessions.write_pipe = BLOCK_WRITE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nwrite = MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nwrite = -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}</DIV>
<DIV>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return nwrite;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;else<BR>&nbsp;return MS_SOC_WAIT;<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;*/<BR>&nbsp;return MS_SOC_INVALID;//最外边返回值<BR>}</DIV>
<DIV>int ms_soc_send(int s, const void * buf, int len)<BR>{<BR>&nbsp;int handle = s;<BR>&nbsp;int nwrite;</DIV>
<DIV>&nbsp;if ((handle &gt;= 0) &amp;&amp; (handle &lt; MS_SOC_MAX_NUM) &amp;&amp; <BR>&nbsp;&nbsp;sessions.used &amp;&amp; (sessions.handle == handle)) <BR>&nbsp;{<BR>&nbsp;&nbsp;if (sessions.tcp_state == TCP_WAIT_CLOSE)<BR>&nbsp;&nbsp;&nbsp;return -1;</DIV>
<DIV>&nbsp;&nbsp;if (sessions.write_pipe == CAN_WRITE<BR>&nbsp;&nbsp;&nbsp;&amp;&amp; sessions.tcp_state == TCP_CONNECTED)<BR>&nbsp;&nbsp;{</DIV>
<DIV>&nbsp;&nbsp;&nbsp;int v;<BR>&nbsp;&nbsp;&nbsp;fd_set fdwrs;<BR>&nbsp;&nbsp;&nbsp;struct timeval timeout = {0, 0};<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;FD_ZERO(&amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;FD_SET(sessions.socket, &amp;fdwrs);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if ((v = select(1, NULL, &amp;fdwrs, NULL, &amp;timeout)) == SOCKET_ERROR) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if (v &gt; 0 &amp;&amp; FD_ISSET(sessions.socket, &amp;fdwrs)) <BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;nwrite = send(sessions.socket, (char*)buf, len, 0);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;if (nwrite == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;switch(WSAGetLastError())<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;case WSAEWOULDBLOCK:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessions.write_pipe = BLOCK_WRITE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nwrite = MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nwrite = -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;return nwrite;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;&nbsp;&nbsp;<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;&nbsp;return MS_SOC_INVALID;<BR>}</DIV>
<DIV>int ms_inet_addr(char * ipchar, uint8 * ip)<BR>{<BR>&nbsp;uint32 ipp = inet_addr(ipchar);<BR>&nbsp;if (ip)<BR>&nbsp;&nbsp;memcpy(ip, &amp;ipp, 4);<BR>&nbsp;return ipp;<BR>}</DIV>
<DIV>void get_host_timer_cb(int tid, int p) <BR>{<BR>&nbsp;soc_session_t* session = NULL;<BR>&nbsp;session = (soc_session_t*)_ms_soc_session_get(p);<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;if (session-&gt;get_host_cb)<BR>&nbsp;&nbsp;&nbsp;session-&gt;get_host_cb(p, *(long*)session-&gt;addr.addr);<BR>&nbsp;}<BR>}</DIV>
<DIV>int ms_soc_gethostbyname(int s, const char * host, void * cb)<BR>{<BR>&nbsp;int ip;<BR>&nbsp;HOSTENT* hent;<BR>&nbsp;static char g_host;<BR>&nbsp;soc_session_t* session = NULL;</DIV>
<DIV>&nbsp;session = (soc_session_t*)_ms_soc_session_get(s);<BR>&nbsp;if (session)<BR>&nbsp;{<BR>&nbsp;&nbsp;if ((hent = gethostbyname(host)) != 0)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;ip = *(long*)hent-&gt;h_addr;<BR>&nbsp;&nbsp;&nbsp;if (strcmp(g_host, host) == 0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;return ip;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(session-&gt;addr.addr, &amp;ip, sizeof(long));<BR>&nbsp;&nbsp;&nbsp;&nbsp;session-&gt;get_host_cb = cb;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ms_quick_timer(200, s, get_host_timer_cb, 0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(g_host, host);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return MS_SOC_WAIT;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return MS_SOC_ERROR;<BR>&nbsp;}<BR>&nbsp;return MS_SOC_INVALID;<BR>}<BR></DIV>
页: [1]
查看完整版本: udp编译模型-- 基于tcp上二次开发