首先我们看一段python client/server代码。

server端:

>>> import sys,socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> MAX = 65535
>>> PORT = 1060
>>> s.bind(('127.0.0.1', PORT))
>>> print 'Listening at', s.getsockname()
Listening at ('127.0.0.1', 1060)
>>> while True:
... data, address = s.recvfrom(MAX)
... print 'the client at', address, 'says', repr(data)
... s.sendto('Your data was %d bytes' % len(data), address)

可以知道server监听在127.0.0.1的1060端口上。当收到 client发来的一段信息之后就会返回给 client一段话.

再看client端:

import socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
print 'Address before sending:', s.getsockname()
s.sendto('This is my message', ('127.0.0.1', PORT))
print 'Address after sending', s.getsockname()
data, address = s.recvfrom(MAX) # overly promiscuous - see text!
print 'The server', address, 'says', repr(data)

客户端非常简单,创建一个socket,通过socket的sendto像server发送一段信息,然后把收到的回复打印出来。

正常情况下,这两段代码是没什么问题的。可是如果这时候server没有运行,我们的客户端运行之后会怎么样呢? 会 stuck在

data, address = s.recvfrom(MAX)

这时候如果你通过一个其它的机器伪造server像client发回复会怎么样呢?我们新开一个窗口输入下面代码来看看

>>> import sys,socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.sendto('fake' , ('127.0.0.1',56557))
4

注意这里的4是sendto的返回值,表示发送了多长的数据。

我们看client端

>>> data, address = s.recvfrom(MAX) # overly promiscuous - see text!
>>> print 'The server', address, 'says', repr(data)
The server ('127.0.0.1', 33670) says 'fake'

client依然把我们伪造的server发回的信息当做server回复处理。  很多时候这是我们不想看到的。 这时候 connect的作用就体现出来了。 通过connect,client将会识别出server的ip和port。如果有数据从其它的ip和port发回,client将不会把它当做server回复。 并且调用了connect之后我们使用的是send()和recv()而不是 sendto()和recvfrom(). 看如下例子:

>>> import sys ,  socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.connect(('127.0.0.1',1060))
>>> print 'Client socket name is', s.getsockname()
Client socket name is ('127.0.0.1', 48824)
>>> s.send('This is another message')
23
>>> data = s.recv(65535)
>>> print 'The server says', repr(data)
The server says 'Your data was 23 bytes'

这个例子中client调用了connect, 然后用了send 和recv去发收消息。 当发送往正确的server的时候,正常收到了回复。 但是我们看看如果用一个错误的server发送消息给client它还会不会收到呢?

>>> s.sendto('fake' , ('127.0.0.1',48824))
4

在一个新窗口中用socket发送消息到我们 client socket的端口。 但是client端没有反应。

>>> data = s.recv(65535)

这是因为 connect 的起到了过滤的作用。 client只会识别connect中提到的server。

值得了解的是,connect存在的意义不是出于安全考虑。因为connect实际上做的事情是在 OS 的内存中记住了server的地址信息。这样当你调用send 和 recv的时候就不用指定地址了。 调用connect不会在网络上传输数据。 而如果有黑客真的想攻击你,他可以很容易的把自己的地址伪装成server的ip和端口。

所以如果你的client想要能够识别server和非server, 你可以有两种办法:

1. 是调用connect。 这种方法非常简单,因connect会在OS的内存中记住server的信息。以后调用send 和 recv实际上都是去查阅这个server信息。 但是这种方法有个不方便的地方就是你一次只能跟一个server对话。如果你想发送给其它的server,需要重新调用connect,但是这样会覆盖之前的connect记住的server信息。

2. 就是不调用connect,直接使用sendto和recvfrom。在recvfrom之后你可以获得给你发信息的机器的地址信息。你可以写一段代码手动的去比较看是不是真正的服务器。这种方式要手动的写新代码。但是比较灵活,如果你想与多个server通信就不必重复的connect。

很重要的一点补充。这里的connect是用在UDP上的。而不是TCP。TCP上的connect是真正的网络函数,它会发起TCP三步握手去连接服务器。

python network programming--connect()的更多相关文章

  1. python network programming tutorial

    关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...

  2. Python Network Programming

    @1: 同步网络编程(也就是阻塞方式) 同步网络编程一次只能连接一个客户端. Server端: import socket def debugPrint(name, value): print(&qu ...

  3. Python socket – network programming tutorial

    原文:https://www.binarytides.com/python-socket-programming-tutorial/ --------------------------------- ...

  4. Neural Network Programming - Deep Learning with PyTorch with deeplizard.

    PyTorch Prerequisites - Syllabus for Neural Network Programming Series PyTorch先决条件 - 神经网络编程系列教学大纲 每个 ...

  5. [C1W2] Neural Networks and Deep Learning - Basics of Neural Network programming

    第二周:神经网络的编程基础(Basics of Neural Network programming) 二分类(Binary Classification) 这周我们将学习神经网络的基础知识,其中需要 ...

  6. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记

    第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...

  7. Professional iOS Network Programming Connecting the Enterprise to the iPhone and iPad

    Book Description Learn to develop iPhone and iPad applications for networked enterprise environments ...

  8. Fast portable non-blocking network programming with Libevent

    Fast portable non-blocking network programming with Libevent Fast portable non-blocking network prog ...

  9. Andrew's Blog / 《Network Programming with Go》学习笔记

    第一章: Architecture(体系结构) Protocol Layers(协议层) ISO OSI Protocol 每层的功能: 网络层提供交换及路由技术 传输层提供了终端系统之间的数据透明传 ...

  10. 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 3、Python Basics with numpy (optional)

    Python Basics with numpy (optional)Welcome to your first (Optional) programming exercise of the deep ...

随机推荐

  1. Java中从控制台输入的三种方式

    我们最熟悉的从控制台读取一个字符或者一个字符串都知道用Scanner,那么除了Scanner还有没有其他的呢,答案是有的,我们来看看. System.in.read() System.in.read( ...

  2. 自定义View(8)关于measure->onMeasur->setMeasuredDimension及getDefaultSize,resolveSizeAndState

    参考: http://www.cnblogs.com/xiaorenwu702/p/5185436.html 当外层容器组件调用其内部的某个组件view1.measure(xxx)时,view1的on ...

  3. java中使用String的replace方法替换html模板保存文件

    在我们的D盘下有这样一个html模板,现在我们要做的就是解析news.template文件,从数据库中提取数据将数据添加到指定的模板位置上 <head> <title>{tit ...

  4. S2深入.NET编程总结

    不知从几何时,我也开始变得懒了,以往为了学习的那股子斗劲也早已不在,是时候反思反思了.失败的检测成绩希望可以把我唤醒. 经过总结,在本书中大概学到了这些知识: 1.如果一个类可序列化,则它的子类和包含 ...

  5. SQL Server应用模式之OLTP系统性能分析

    OLTP系统的最大特点,是这类应用里有大量的,并发程度比较高的小事务,包括SELECT.INSERT.UPDATE和DELETE. 这些操作都比较简单,事务时间也不会很长,但是要求的返回时间很严格,基 ...

  6. JVM 优化之逃逸分析

    整理自 周志明<深入JVM> 1, 是JVM优化技术,它不是直接优化手段,而是为其它优化手段提供依据. 2,逃逸分析主要就是分析对象的动态作用域. 3,逃逸有两种:方法逃逸和线程逃逸.   ...

  7. 一、CSS的基础样式

    CSS的基础样式 border 边框 复合写法 border:border-width  border-style border-color: border-width:边框宽度 top right ...

  8. UI开发模式对比:JSP、Android、Flex

    前一篇文章分析了Java平台下不同类型WEB框架对开发模式的影响,多数Java领域的WEB框架都是聚焦于服务端MVC的实现,这些框架对View的支持,通常是基于标准的JSP或类似JSP的模板技术如Fr ...

  9. Monkey测试总结

    Monkey测试总结 1.什么是Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等), 实 ...

  10. jQuery——多库共存

    多库共存:jQuery占用了$ 和jQuery这两个变量.当在同一个页面中引用了jQuery这个js库,并且引用的其他库(或者其他版本的jQuery库)中也用到了$或者jQuery这两个变量,那么,要 ...