IPEndPoint 能用于gprs连接互联网网吗

7539人阅读
GPRS资费受3G的影响逐渐降低,目前5元包月即可以获得30M的流量,而cmwap日渐式微大有被cmnet取代之势(北京GPRS套餐其流量已不区分cmwap和cmnet),而后者可无障碍地和因特网互联互通,这种变化更促进了GPRS的进一步应用。
原以为一旦GPRS连接建立,手机与接入因特网的PC通信和PC之间的通信一样简单,通过简单配置后就可以用socket进行互联,后来深入研究才发现暗礁重重,要想完美实现手机和PC的互联互通还真得费一番功夫。
试验平台如下:
1、智能手机Windows Mobile 6.0;
2、一台通过ADSL上网的PC(动态公网IP,每次拨号连接后的IP都很随机);
3、一个个人网站空间;
实现思路如下:
1、开发一个运行在PC上的网络服务程序(服务端),功能包括:获取PC拨号后的动态公网IP,把该IP和端口信息上传到有固定域名的个人网站空间(当然这个功能也可以用花生壳之类的工具完成域名到动态IP的绑定);提供特定的功能的网络服务(如让家中的电脑执行如下载指定的文件,打开摄像头等任务,甚而如果PC连接了家庭控制系统,可以遥控家里的空调、热水器等家电进行工作)。
2、开发运行在Windows Mobile 5.0/6.0上的客户端控制程序,功能包括:可从指定URL获得PC服务程序上传的IP和端口信息;通过获得的IP、端口和PC上的服务程序进行连接并通信,从而得以远程控制居家的PC。
网络拓扑图:
& 说明:① PC上传公网IP和端口号到Web服务器;
② 手机从Web服务器获取PC的IP和端口号;
③ 手机和PC直接通信互联;
实际效果图:
说明:① 选择GPRS接入点(要选择Internet设置),并接入;
② 探测居家PC的IP和端口(从Web Server获取);
③ 连接居家PC,并进行通信测试;
说明:PC服务程序
相关代码部分:
1、GPRS连接
相关代码已有很多网上文章进行了介绍,本部分的代码主要来自于网络,并进行了些微调整,详情可参见:
本打算让程序也可以通过cmwap进行连接,调试时程序也可以和代理服务器10.0.0.127:80进行连接,但是相关的Http请求总是返回出错,查看了相关文章,估计移动对10.0.0.127代理还是做了一定的限制的,幸好cmnet目前已可取代cmwap,所以我们姑且先用cmnet方式吧,不过如果在cmwap上网友有更好的解决方案,也希望能share一下。
2、GPRS文件下载(下载IP和端口信息)
奇怪的是下列代码当手机通过Microsoft ActiveSync连接时,可以正确获取,但是建立GPRS连接后则代码执行失败。
string DownLoadFile(string fileURL)
StreamReader rdr = null;
FileStream wrtr = null;
string localFileName = string.E
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(fileURL);
req.Method = "GET";
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
long len = resp.ContentL
Stream respStream = resp.GetResponseStream();
localFileName = @"/Program Files/" + fileURL.Substring(fileURL.LastIndexOf("/") + 1);
wrtr = new FileStream(localFileName, FileMode.Create);
byte[] inData = new byte[4096];
int bytesRead = respStream.Read(inData, 0, inData.Length);
while (bytesRead & 0)
wrtr.Write(inData, 0, bytesRead);
bytesRead = respStream.Read(inData, 0, inData.Length);
System.IO.FileInfo fi = new FileInfo(localFileName);
if (fi.Length != len) localFileName = string.E
fi = null;
if (rdr != null) rdr.Close();
if (wrtr != null) wrtr.Close();
return localFileN
最后没有办法,我只好自己实现了一个基于HTTP协议下载的程序,相关代码如下:
HttpDownload(string url)
url = url.ToLower().Replace("http://", "");
int offset = url.IndexOf("/");
string Host=url.Substring(0,offset);
string file = url.Substring(offset);
IPHostEntry IpHost = Dns.GetHostEntry(Host);
Socket Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IpHost.AddressList[0], 80);
Sock.Connect(point);
if (Sock.Connected)
&&&&&&&&&&&&&&&&&& string strGet = "GET " + file + " HTTP/1.0/r/n" +
"Host:" + Host + "/r/n" +
"Accept:*/*/r/n" +
"User-Agent:GeneralDownloadApplication/r/n" +
"Connection:Keep-Alive/r/n/r/n";
Byte[] cmd = Encoding.Default.GetBytes(strGet.ToCharArray());
Sock.Send(cmd, cmd.Length, SocketFlags.None);
string strInfo = "";
&&&&&&&&&&&&&&&&for (int i = 0; i & 1000; i++)& //10s
if (Sock.Available & 0)
Byte[] bytes = new Byte[1024];
int intSize = Sock.Receive(bytes, 1024, 0);
strInfo += Encoding.Default.GetString(bytes, 0, intSize);
if (strInfo.IndexOf("HTTP/1.1 200 OK") == 0)
&&&&&&&intSize = strInfo.IndexOf("/r/n/r/n");
if (intSize & 0)
return strInfo.Substring(intSize + 4);
&&&&&&&&&&}
Thread.Sleep(10);
return "";
3、GPRS通信程序,该部分和正常的Socket通信一般无二,所以相关代码略。
4、服务端信息上传代码。
该部分代码实现比较简单,直接用WebClient类的UploadString可以上传到指定FTP服务器,代码如下:
bool HttpUpLoad(string HostName,string ip,int port)
WebClient client = new WebClient();
{& client.UploadString("ftp://yefan:1234@blog.csdn.net/yefanqiu/" + HostName + ".txt", ip + "|" + port.ToString() + "|" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
return true;
catch(Exception ex)
YFBase.ShowInfo(ex.Message.ToString(), "HttpUpLoad", YFBase.InfoTypes.LVS_error);
return false;
5、服务端通信代码,和客户端一样,普通的Socket通信,代码略。
以上仅仅是一个简单的demo和粗略的想法,希望能起到抛砖引玉的作用,让更多的网友参与其中,做出更炫更实用的GPRS程序。(作者:叶帆 2009年9月6日)
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1885561次
积分:23321
积分:23321
排名:第83名
原创:376篇
评论:2341条
文章:77篇
阅读:291466
(1)(1)(1)(1)(4)(1)(1)(1)(1)(1)(4)(2)(4)(1)(2)(4)(4)(3)(1)(1)(1)(1)(1)(8)(1)(3)(4)(1)(3)(7)(3)(5)(4)(8)(4)(6)(1)(4)(11)(10)(2)(4)(5)(4)(1)(4)(1)(3)(2)(5)(2)(3)(2)(2)(1)(2)(5)(3)(7)(14)(2)(13)(10)(7)(9)(3)(7)(4)(11)(2)(9)(5)(5)(2)(5)(3)(5)(5)(7)(5)(3)(3)(6)(4)(2)(1)(12)(8)(1)(1)(4)(6)(1)(3)(3)(4)(5)(1)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于GPRS的通信技术在油井监测系统中的应用的研究.pdf62页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:220 &&
优秀硕士毕业论文,完美PDF格式,可在线免费浏览全文和下载,支持复制编辑,可为大学生本专业本院系本科专科大专和研究生学士硕士相关类学生提供毕业论文范文范例指导,也可为要代写发表职称论文提供参考!!!
你可能关注的文档:
··········
··········
随着计算机技术和移动通信技术的飞速发展,基于GPRS的远程监测系统日益成为
研究热点。基于GPRS的通信技术是远程监测系统的重要组成部分,承担着为监测系统
提供原始数据和保证数据稳定的任务。
目前石油行业的信息化建设仍然比较落后,以胜利油田为例,绝大多数油井没有实
现油井工作状况和产液量等数据的远程监测。针对这样一个现状,本论文研究了基于
GPRS的通信技术在油井远程监测系统中的应用,获得了油井现场数据。
首先,本文讨论分析了通信系统的组网方案、GPRS在本课题中的应用、TCP/口技
术、传输层协议的选择。然后,基于上述的分析和讨论,从监测系统的实际情况出发,
将现场的两部分数据整合到一起,并详细设计了电参数和示功图数据的通信方案以及产
液量和油温油压数据的通信方案。接下来,对通信规约和通信数据项进行了简要介绍。
确定了通信系统的整体方案之后,本文详细分析了多种数据通信关键技术在本课题
中的应用。然后,分多个方面介绍了数据通信中心的实现。这些方面包括:数据通信程
序的功能综述、数据通信的总体实现、数据通信的具体实现、程序功能的完善。重点分
析了多线程技术、线程同步技术、通信时间超时机制、补抄数据、异常处理、通信故障
和数据异常的自动记录等。
最后,经过多次调试,数据通信程序稳定地得到了油井现场数据,取得了良好的效
关键词:GPRS,多线程,线程同步,超时机制
ResearchonGPRS-basedCommunication Well
Technology
正在加载中,请稍后...课设要求做windows下的socket通信编程,没有办法,恶补吧。一向不喜欢网络编程的我只能慢慢来,说实话不是不喜欢,是怕麻烦。
计算机有那么多层的结构,每层又有那么多协议,明白每个协议的内容和作用,对通信的流程有很清晰的了解,对传输的数据明白怎样进行解析,明白怎样唯一确定到网络中的某个特定的计算机,怎样解析DNS等等,特别是最烦网络这一层,什么ip,dns,socket,tcp,http,udp等等真的是傻傻分不清楚。、
其他先不谈,只能先说C#下的网络编程了。
1.明确什么是端口port:想想计算机为什么能对外传输数据,对内接受数据的?很简单一个不太恰当的比方,一个水库,能蓄水能排水,水是怎么进去又是怎么出来的呢,肯定是通过水库的闸门了,ok,那个闸门就是我理解的端口。
不恰当的地方是,不能形容一个端口可以被不同的程序占用,但不能同时占用。
2.明确什么是套接字Socket:只要牢记Socket介于应用程序和Port之间,用于将应用程序与端口连接起来。
(1)常用方法:
GetHostAddresses& & & & 返回指定主机的Internet协议(ip)地址族
GetHostEntry & & & & &将主机名或IP地址解析为IPHostEntry实例
GetHostName & & & & & 获取本地计算机的主机名,与GetHostByName有联系
GetHostByAddress & & &获取IP地址的DNS主机信息
GetHostByName & & & & 获取指定DNS主机名的DNS信息,与GetHostName有联系
(2)实例代码:
string hostName = Dns.GetHostName();//获取本机名
string dnsInfo = Dns.GetHostByName(Dns.GetHostName()).HostN//根据指定的主机名获取DNS信息
4.IPAddress类
(1)重要的字段,属性和方法:
Any字段 & & & & & & & &提供一个IP地址,指示服务器应侦听所有网路接口上的客户端活动,只读
Address属性 & & & & & &IP地址
AddressFamily属性 & & &IP地址的地址族
Parse方法 & & & & & & &将IP地址字符串转换为IPAdress实例(这个很常用)
(2)实例代码:
IPAddress[] ips = Dns.GetHostAddresses(这边是你的ip地址);//获取指定主机的IP地址族
foreach(IPAddress ip in ips)//循环遍历得到IP地址
string ipAddress = ip.ToString();//ipAddress即是ip地址的字符串
IPAddress ipaddress = IPAddress.Parse(这边是IP地址字符串);
3.IPEndPoint类
说白了,我的理解,这个类就相当于一个包装器,组合器。通过组合服务的主机IP地址和端口号,形成到服务的连接点。
(1)常用的字段,属性:
Address属性 & & & & & &获取或设置终结点的IP地址
AddressFamily属性 & & &获取IP地址族
Port属性 & & & & & & & 获取或设置终结点的端口号
(2)实例代码:
//创建IPEndPoint对象,当然你可以直接new IPEndPoint(IPAddress类型的ip地址,8888)
IPEndPoint IPEPoint = new IPEndPoint(IPAddress.Prase(IP地址字符串),8888)
//获取它的IP地址
IPAddress ipAddress = IPEPoint.Address
//获取它的端口号
int port = IPEPoint.Port
综上所述:
总结了两种获得本地ip地址的方式:
IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
foreach(IPAddress ip in ips)
IPAddress ipa = ip.Address
当然这是一个foreach循环,里面不会那么写,那样写就覆盖掉之前的了,这边一般是把结果转换成string类型显示在前台的某个label里面或者textbox里面。我这边只是一个例子罢了,莫较真。
2.IPHostEntry:为Internet主机地址信息提供容器的类,你看做容器就行了。
当然也可以充分利用DNS类的GetHostEntry这个方法,原理类似
IPHostEntry ipEntry = Dns.GetHostByName(Dns.GetHostName());
IPAddress ip = ipEntry.AddressList[0];
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:38190次
积分:2541
积分:2541
排名:第5306名
原创:113篇
评论:29条
(3)(18)(3)(27)(8)(33)(27)bool&CTCPClient_CE::Connect(){&&&struct&sockaddr_in&&&&int&&&&addr.sin_family&=&AF_INET;&&&addr.sin_port&=&htons(m_port);&&&//此处要将双字节转换成单字节&&&char&ansiRemoteHost[<span style="color: #5];&&&&ZeroMemory(ansiRemoteHost,<span style="color: #5);&&&&WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_remoteHost,wcslen(m_remoteHost)&&&&&&&&,ansiRemoteHost,wcslen(m_remoteHost),NULL,NULL);&&&addr.sin_addr.s_addr=inet_addr(ansiRemoteHost);&&&//创建TCP套接字&&&&m_socket&=&socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);&&&if&(m_socket&==&INVALID_SOCKET)&&&{&&&&&&&return&FALSE;&&&}&&&//此时采用同步连接方式,connect直接返回成功或是失败&&&err&=&connect(m_socket,(struct&sockaddr&*)&addr,sizeof(addr));&&&if&(err&==&SOCKET_ERROR)&&&&{&&&&&&&return&FALSE;&&&}&&&//设置通讯模式为异步模式&&&DWORD&ul=&<span style="color: #;&&&ioctlsocket(m_socket,FIONBIO,&ul);&&&return&TRUE;}
服务器端用.net平台如下:
private&void&StartToListen(object&sender,&DoWorkEventArgs&e)&&&&&&&&{&&&&&&&&&&&&try&&&&&&&&&&&&{&&&&&&&&&&&&&&&&this.listenerSocket&=&new&Socket(AddressFamily.InterNetwork,&SocketType.Stream,&ProtocolType.Tcp);&&&&&&&&&&&&&&&&this.listenerSocket.Bind(new&IPEndPoint(this.serverIP,&this.serverPort));&&&&&&&&&&&&&&&&this.listenerSocket.Listen(<span style="color: #0);&&&&&&&&&&&&&&&&while&(bListen)&&&&&&&&&&&&&&&&&&&&this.CreateNewClientManager(this.listenerSocket.Accept());&&&&&&&&&&&&}&&&&&&&&&&&&catch(SocketException&ex)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&if&(ex.ErrorCode&==&<span style="color: #004)&&&&&&&&&&&&&&&&&&&&return;&&&&&&&&&&&&&&&&else&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&throw&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}
第二步,进行侦听。获取数据,发送数据。客户端发送数据:
bool&CTCPClient_CE::SendData(const&char&*&buf&,&int&len){&&&&int&nBytes&=&<span style="color: #;&&&&int&nSendBytes=<span style="color: #;&&&&&&&&&&&&&&&&while&(nSendBytes&&&len)&&&&{&&&&&&&&nBytes&=&send(m_socket,buf+nSendBytes,len-nSendBytes,<span style="color: #);&&&&&&&&if&(nBytes==SOCKET_ERROR&)&&&&&&&&{&&&&&&&&&&&&int&iErrorCode&=&WSAGetLastError();&&&&&&&&&&&&//触发socket的Error事件&&&&&&&&&&&&OnError(m_pOwnerWnd,iErrorCode);&&&&&&&&&&&&//触发与服务器端断开连接事件&&&&&&&&&&&&OnDisConnect(m_pOwnerWnd);&&&&&&&&&&&&//关闭socket&&&&&&&&&&&&Close();&&&&&&&&&&&&return&FALSE;&&&&&&&&}&&&&&&&&nSendBytes&=&nSendBytes&+&nB&&&&&&&&&&&&&&&&if&(nSendBytes&&&len)&&&&&&&&{&&&&&&&&&&&&Sleep(<span style="color: #00);&&&&&&&&}&&&&}&&&&&return&TRUE;&}
&&&&&&&&&&&&& 服务器端发送数据:
private&bool&SendCommandToClient(Command&cmd)&&&&&&&&{&&&&&&&&&&&&try&&&&&&&&&&&&{&&&&&&&&&&&&&&&&semaphor.WaitOne();&&&&&&&&&&&&&&&&string&strSentInfo&=&string.E&&&&&&&&&&&&&&&&strSentInfo&=&string.Format("发送者:{0}{1}内容:{2}",&cmd.SenderName,&Environment.NewLine,&cmd.MetaData);&&&&&&&&&&&&&&&&byte[]&buffer&=&new&byte[<span style="color: #6];&&&&&&&&&&&&&&&&buffer&=&System.Text.Encoding.Default.GetBytes(strSentInfo);&&&&&&&&&&&&&&&&this.networkStream.Write(buffer,&<span style="color: #,&buffer.GetLength(<span style="color: #));&&&&&&&&&&&&&&&&this.networkStream.Flush();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&semaphor.Release();&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&}&&&&&&&&&&&&catch&&&&&&&&&&&&{&&&&&&&&&&&&&&&&semaphor.Release();&&&&&&&&&&&&&&&&return&false;&&&&&&&&&&&&}&&&&&&&&}
可以看出,虽然他们语法不相同,语义却相同。在实例化一个套接字对象socket时,我们都要指定协议簇,套接字类型(有流式套接字、数据报套接字和原始套接字等类型)和传输协议,成功获取套接字后服务器端要与指定端口绑定(Bind),然后进行监听(Listen),并调用accept ()方法。Accept() Socket而客户端完成套接字的实例化后,开始调用Select()函数判断是否有读事件发生,如果有则调用Recv()函数获取从服务器端发来的数据或者调用Send()函数来向服务器发送数据。客户端主要函数为:bool Open(CWnd * pWnd);bool Connect();bool SendData(const char * buf , int len);bool Close();服务器端主要函数为: sender, DoWorkEventArgs e);void CreateNewClientManager(Socket socket);void StartReceive(object sender, DoWorkEventArgs e);void SendCommandToClient(Command cmd);
三、引用(参考)文章
1. (socket编程原理-很不错);
2.(msdn 开发中心socket部分)
3.实战篇源代码下载:&

我要回帖

更多关于 不能用于病因的研究 的文章

 

随机推荐