鱼C论坛

 找回密码
 立即注册
查看: 1478|回复: 6

python socket.accept()问题

[复制链接]
发表于 2018-3-6 20:33:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind("localhost",7777)
while True:
        s.listen(5)
        conn, addr = s.accept()
提问,conn和s使用getsockname()方法得到的ip地址和端口一样,那么使用accept()方法得到的conn和s到底有没有不一样的地方呢,如果有,还请大佬指教
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-6 23:05:58 | 显示全部楼层
  1. # -*- coding: utf-8 -*-
  2. from socket import *

  3. s = socket(AF_INET, SOCK_STREAM, 0)
  4. #参数一:地址簇
  5. #   AF_INET IPv4(默认)
  6. #   AF_INET6 IPv6
  7. #   AF_UNIX 只能够用于单一的Unix系统进程间通信
  8. #参数二:类型
  9. #   SOCK_STREAM  流式socket , for TCP (默认)
  10. #   SOCK_DGRAM   数据报式socket , for UDP
  11. #   SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;
  12. # 其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL
  13. # 套接字选项由用户构造IP头。
  14. #   SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。
  15. #   SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。
  16. # SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
  17. #   SOCK_SEQPACKET 可靠的连续数据包服务
  18. #参数三:协议
  19. #   0(默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,
  20. # 自动选择一个合适的协议

  21. s.bind(('', 6666)) #注意里面是tuple
  22. # 用法详解
  23. # s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。
  24. # 在AF_INET下,以元组(host, port)的形式表示地址。host空代表本机,后面端口号6666是通讯端口

  25. s.listen(1)
  26. # 用法详解
  27. # s.listen(backlog)开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
  28. # backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数
  29. # 最大为5,这个值不能无限大,因为要在内核中维护连接队列

  30. sock, addr = s.accept()  #类似raw_input,需要等待输入,变量名无所谓,我个人觉得用sock好理解
  31. # 接受连接并返回(conn, address),其中conn是新的套接字对象,可以用来接收和发送数据。
  32. # address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来。

  33. print('Connected by ', addr)  #看下连接过来的IP地址

  34. sock.send('Welcome!!!aaabbbccc')
  35. #注:sock.send(string[, flag])
  36. # 将string中的数据发送到连接的套接字。返回值是要发送的字节数量,
  37. # 该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

  38. text = sock.recv(1024)   #获取客户端数据
  39. #注:sock.recv(bufsize[,flag])
  40. # 接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。
  41. # flag提供有关消息的其他信息,通常可以忽略。

  42. print(text)  #打印获得的数据

  43. sock.close()
  44. s.close()   #关闭相应的socket




复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-7 10:18:55 From FishC Mobile | 显示全部楼层
Charles未晞 发表于 2018-3-6 23:05

我不懂的accept方法返回的是一个新的套接字和地址的元组,这个新的套接字和之前的s,也就是之前的套接字有什么区别
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-7 10:34:34 From FishC Mobile | 显示全部楼层
Charles未晞 发表于 2018-3-6 23:05

比如说,我对sock和s用gethostname方法发现你上述代码发的sock和s的返回值竟然是一样的,但是sock可以和已经连接的客户端进行通信,并且使用send方法发送信息给客户端,但是s不行,因为s仅仅只是将自己绑定了服务器端口,我想知道的是sock和s内区别在哪里以至于sock可以实现s做不到的事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-12 21:33:55 | 显示全部楼层
老铁我能不能问一下怎么安装python的socket模块呀,我用pip安装不了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-27 01:46:15 | 显示全部楼层
socket自带的,不用安装
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-27 01:46:54 | 显示全部楼层
我贼直! 发表于 2018-4-12 21:33
老铁我能不能问一下怎么安装python的socket模块呀,我用pip安装不了?

socket自带的,不用安装
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-28 08:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表