windows TCP socket在C++下的编程入门 1

  在这个项目方面真的没有太多足够的资料(我认为)去指导新手去理解windows sockets和用他们编程,我认为在尝试找到适当的指导资料所遇到的困难在我开始自己编程之后并没有让我把我的问题搁置。

  距离现在已经很久了,编程第一个能够和其他电脑通信的应用程序对于我来说是个很大的挑战,虽然我第一次介绍sockets是通过visual basic,一个高级和对用户友好的编程语言。现在距离我使用更加强大的C++已经有一段时间了,我发现我花费在vb上面sockets的代码并没有什么用。

  幸运的是,在花费很多时间在网络上搜索网页之后,我能够收集所有零碎的东西并最终编译出了我一个在C++上的程序。我的目标是在同一个地方收集所有必要的信息,就在这里

这样的话读者就不用通过网络取收集数据了,因此我发布这篇指导希望这能成为开始编程的有效资料。

 在我们开始之前,你需要包含winsock.h和连接libws2_32.a到你的项目上为了使用在TCP/IP上必要地API,如果还是不行,再在运行的时候使用loadlibrary()来加载ws2_32.dll或者其他一些类型的方法。

 这边文章所有的这些代码都是在"Bloodshed Dev-C++4.9.8.0"上写的和测试的。但一般来说它应该能在任何编译器上运行,有时虽然可能会做很小的更改。

 被叫做 Thread,ports.Sockets的是什么?

    事实上我们能够用图形化的语言生动形象的描述什么是"socket"以及它是怎么工作的,你能理解为socket是一个机器上的socket是一个连接的接收终端,而"thread"是一个在你的电脑和建立连接的远程电脑之间的一个形象的名字,thread用来连接socket.

为了不因为使用过多的专业术语而使你混乱,你能把"thread"想象成一个真实的,物理上的缝纫机上面用的线,他用来从一个电脑连接上另一个电脑,这个比喻比较形象,为了使这条线能够连接上其他电脑,你还需要在你想要连接的电脑上安装一个东西来连接这条线,这个东西就叫做sockets。

 一个socket能在任何端口打开(端口就是所谓的port),port单纯的只是一个独特的用来区别其他线程的数字,因为在同一个电脑上面有不止一个连接,很少的一些端口被设定用来处理一个指定的目的,在这些端口中,有相当大的一些其他端口能够用来做很任何事,超过6000个,实际上,有一个普遍被使用的端口被登记了他们相应的服务。

例如

 端口          服务

   7             ping

  13            time

   15          Netstat

  22            SSH

  23            Telnet(default)

   25          SMTP(send mail)

   43         Whois (Query information)

  79          Finger(Query server information)

  80          HTTP(Wed pages)

  110        POP(Receive main)

  119        NNTP

  513        CLOGIN(Used for IP spoofing)

还有其他一些有着特定功能的端口没有被列出来,只是一个有代表性的,如果你想要使用一个没有特别登记的端口,在1000到6535之间的任何端口都行,当然反之。如果你想从服务端口监听发送消息,你也能通过这个端口。

  你现在连接上了电脑吗?假设你连接上了并且这有一些IE或者其他一个网页服务正在运行,比如AOL或者一些其他的聊天程序,在这种情况下(保证连接不是很慢)你尝试发送和接收一些邮件,你认为你改使用哪个端口来发送和接受邮件呢?

  例如IE发送和接收数据时通过端口80

  AOL和其他的一些即时通讯程序为了安全,防止冲突,通常在成千上万个更高等级的未被使用的的端口挂起。因为每个聊天程序不同所以没有特定的"chat"服务,多个消息传递程序可能在同一时间运行。

 当你在发送邮件时,你和你的远程邮件对话者使用端口25交流

 当你接收邮件时,你的邮件客服(比如microsoft Outlook)正使用端口110来从邮件服务器中接收你的邮件

 

向前延伸的列表

  仅仅是知道你所要使用的端口是不够的,显然我们还需要我们连接的远程电脑或者服务,就像我们要在上车之前找到拜访人的家庭地址,我们还必须知道我们要连接的主机的"IP address"如果我们是建立连接而不是简单的监听(一个聊天程序既需要连接也需要监听)。

IP address是分配给每个网络计算机用来鉴别身份的数字,它包含4组每组3个数字并用逗号分开(比如192.168.1.1),你能够通过在MSDOS下运行ipconfig.exe来看你IP地址。

在这个教程中的例子,我们将使用一个叫做”loop-back address" 的指令在没有连接上互联网的情况下来测试我们的聊天软件,这个IP地址是127.0.0.1,不管什么时候你尝试和这个IP建立连接,这个电脑都将循环处理请求返回你的电脑以及尝试在一个指定的端口锁定服务,这样的话用户和服务器都将在同一台电脑上运行,一旦你尝试连接其他远程电脑以及你想解决你聊天程序中的bug,你们各自将需要得到一个唯一的IP地址来在网络中交流。

  因为作为人我们都会容易忘记事情以及我们不可能希望记住每个网页的一大串数字,所以一些聪明的人想出了一个很棒的方法叫做"domain names",现在我们有了简洁的名字像是www.yahoo.和con,www.cia.gov,用这个代表IP地址比一串笨重的数字更容易记忆。当你在你的浏览器窗口打入某一个这些域名时,通过查找"roter"来找到这个域名的IP地址,一旦它获得了(或者这个主机被解析了),这个浏览器便可以连接这个IP地址的服务。

例如我打电话给一个话务员因为我几乎不记得我女朋友的电话号码了(希望很渺茫),所以我只要打电话给话务员并告诉她她的名字叫什么(有时需要其他的一些信息,但这并不重要)那个话务员就会很快给我电话号码,这就好比通过域名查找到IP地址。

 我们有2个API来完成这个任务(所谓的API就是application program interface只是一个接口,就是编好的函数通过这个接口就可以直接用)。检查别人是不是使用域名而不是IP地址来使用你的程序是个不错的想法,所以你的程序在继续之前能够查找正确的IP地址,大多数人。不管怎么样就是不想记住任何IP地址,所以最有可能发生的是你需要在建立连接之前把你的域名翻译成IP地址--这就需要电脑必须连接上因特网。然后,一旦你有了这个地址,你就能建立连接

  返回一个域名的IP地址:

 DECLARE_STDCALL_P(struct hostent*) gethostbyname(const char*);

 把一个字符串地址转换成一个IP地址注意这个函数返回的地址是正确的字节顺序所以不需要做任何转换(所谓的字节顺序是什么接下来马上就讲)

 using long PASCAL inter_addr(const char *);

字节顺序

 当你觉得所有的这些thread-socket很简单的时候,我们不得不开始讨论字节顺序了。因为因特尔电脑和网络协议双方都使用相反的字节顺序所以我们也不得不在发送前转换每个端口和IP地址成字节顺序,不然会发生很大的混乱,当端口25没有相反转换时,在结束的时候将不是端口25。所以不得不确保我们使用和服务器同样的语言当我们试图和服务器通信时。

  

 


 



 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值