Socket對大部分程式員來說應該不陌生,作為行動裝置的開發人員,對其應該更加瞭解。
在手機上,上網的存取點大致分為CMWAP和CMNET兩種,在CMNET存取點上建立socket通訊應該和在電腦上一樣,在這裡我也就不多說,詳情請參考:《GPRS開發系列文章之實戰篇》(google一下就有,在這裡感謝該作者)。
下面講講我在CMWAP存取點上建立Socket的經驗吧,若有不對之處希望大家指出。
1.建立與移動Proxy 伺服器的socket串連:
bool CTCPClient_CE::Connect()<br />{<br /> //10.0.0.172為代理器地址,80為連接埠號碼<br /> CString m_remoteHost = _T("10.0.0.172");<br /> int m_port = 80;<br /> struct sockaddr_in addr;<br /> int err;</p><p> addr.sin_family = AF_INET;<br /> addr.sin_port = htons(m_port);<br /> //此處要將雙位元組轉換成單位元組<br /> char ansiRemoteHost[255];<br />ZeroMemory(ansiRemoteHost,255);<br />WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_remoteHost,wcslen(m_remoteHost)<br />,ansiRemoteHost,wcslen(m_remoteHost),NULL,NULL);</p><p> addr.sin_addr.s_addr=inet_addr(ansiRemoteHost);</p><p> //建立TCP通訊端<br /> m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);<br /> if (m_socket == INVALID_SOCKET)<br /> {<br /> return FALSE;<br /> }<br /> BOOL sopt = TRUE;<br /> setsockopt(m_socket, IPPROTO_TCP, TCP_NODELAY, (char *)&sopt, sizeof(BOOL));<br /> setsockopt(m_socket, SOL_SOCKET, SO_DONTLINGER, (char *)&sopt, sizeof(BOOL));<br /> //此時採用同步串連方式,connect直接返回成功或是失敗<br /> err = connect(m_socket,(struct sockaddr *)&addr,sizeof(addr));</p><p> if (err == SOCKET_ERROR)<br /> {<br /> return FALSE;<br /> }<br /> //設定通訊模式為非同步模式<br /> DWORD ul= 1;<br /> ioctlsocket(m_socket,FIONBIO,&ul);<br /> return TRUE;<br />}
2.向伺服器發送請求:
void CTCPClient_CE::ConnectHTTP()<br />{<br /> char tmpBuffer[40];<br /> memset(tmpBuffer,0,40);<br /> //116.26.99.xx為需要已連線的服務端的ip,6000為服務端連接埠<br /> static const char* protocolHead = "CONNECT 116.26.99.xx:6000 HTTP/1.1/r/nUser-Agent: MyApp/0.1/r/n/r/n";<br /> send(m_socket, protocolHead,strlen(protocolHead),0);<br />}
3.判斷請求是否成功:
接下來你會收到伺服器的回應,如果成功的話,回應應該是"HTTP/" + 代理版本 + "200" + 描述("Connection established")
下面的代碼是對回應進行判斷
//buf為接受到字串的緩衝區<br />char *tmp=strchr(buf,' ');<br />char flag[4];<br />for(int i=0;i<3;i++)<br />flag[i]=tmp[i+1];<br />flag[4]='/0';<br />if(!strcmp(flag,"200"))<br />{<br /> AfxMessageBox(_T("串連代理服務成功!"));<br />}<br />else<br />{<br /> AfxMessageBox(_T("串連代理服務失敗!"));<br />}<br />
接下來就可以和你想要串連到的伺服器進行串連啦~~這隻是我個人在網上拼拼湊湊寫出來的,如果有不對的地方還希望各位給與指正!
參考網站:
http://blog.csdn.net/wbczyh/archive/2008/02/24/2117094.aspx
http://larch.blog.51cto.com/277889/51991
http://www.cnblogs.com/jsjkandy/archive/2008/08/06/1262445.html