套接字

Winsock API TCP/IP网络通信

爱⌒轻易说出口 提交于 2020-03-03 07:25:02
通信流程如下: 1、Winsock库的装入、初始化 #pragma comment(lib,"WS2_32.lib")、WSAStartup() 2、套接字的创建(服务器端是监听套接字) socket() 3、绑定套接字到指定的IP地址和端口 bind() 4、设置套接字进入监听状态(服务器端)+接受连接请求(服务器端) listen()、accept() 5、请求与服务器连接 connect() 6、收发数据 send()、recv() 7、关闭套接字,释放Winsock库 closesocket()、WSACleanup() 详细流程如下: 服务器端代码: // TCPServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <WinSock2.h> #include <stdio.h> #pragma comment(lib,"WS2_32.lib") //包含相应库文件 int main() { WSADATA wsaData;//结构体。(DLL库)建议版本/支持的最高版本/描述字符串/系统状态字符串/同时支持最大套接字数量 WORD sockVersion = MAKEWORD(2, 0);//windows socket api 版本 ::WSAStartup(sockVersion, &wsaData);

TCP/IP的网络客户端和服务器端程序

[亡魂溺海] 提交于 2020-03-03 07:22:41
服务器端的过程可以分为以下几个步骤: (1) 初始化套接字的版本信息WSAStartup (2)创建套接字 ,需要两个套接字及客户端和服务器端的套接字 (3)绑定服务器(bind),该函数用于绑定服务器套接字 (4)监听服务器(listen),该函数 用于监听服务器 (5)接收客户端请求(accept) 返回值为客户端的套接字,参数为服务器套接字 (6)接收客户端数据(recv) (7)关闭套接字 客户端的过程分为以下几个步骤: (1) 初始化套接字的版本信息WSAStartup (2) 创建套接字( socket)用于连接服务器端 (3) 与服务器进行连接Connect (4) 设置循环状态,进行接收和发送(recv和send) (5) 关闭套接字(closesocket) 来源: https://www.cnblogs.com/gyc19920704/p/5429717.html

Nodejs网络通讯

本小妞迷上赌 提交于 2020-03-03 00:55:43
Node.js 网络通信 Node 是一个面向网络而生的平台,它具有事件驱动、无阻塞、单线程等特性,具备良好的可伸缩性,使得它十分轻量,适合在分布式网络中扮演各种各样的角色。同时 Node 提供的 API 十分贴合网络,适合用它基础的 API 构建灵活的网络服务。本课程的内容就是给大家介绍 Node 在网络通信编程方面的具体能力。 利用 Node 可以十分方便的搭建网络服务器。在 Web 领域,大多数的编程语言需要专门的 Web 服务器作为容器,如 ASP、ASP.NET 需要 IIS 作为服务器,PHP 需要打在 Apache 或 Nginx 环境等,JSP 需要 Tomcat 服务器等。但对于 Node 而言,只需要几行代码即可构建服务器,无需额外的容器。 Node 提供了 net、dgram、http、https 这4个模块,分别用于处理 TCP、UDP、HTTP、HTTPS,适用于服务器端和客户端。 网络通信相关概念 我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗? 互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定

以基于Reactor模式的高并发EchoServer为例剖析muduo库框架

£可爱£侵袭症+ 提交于 2020-03-02 17:40:49
前言 在讲解基于muduo库的高并发echo服务器之前,我们先来回顾一下我们一般编写基于Reactor模式的高并发服务器的基本流程。 muduo的EchoServer其实也是基于上述流程,只不过进行了一定程度地封装,本质上仍是Reactor模式。muduo的example中的echo服务器代码展示的是只有一个reactor的服务器,muduo其实支持one loop per thread + 线程池的模式,也即multiple reactors + 业务线程池的模式,也就是服务器同时有多个IO线程,其中Acceptor所在的IO线程成为mainReactor,其他的IO线程成为subReactor,mainReactor主要负责处理监听描述符listenfd的上的时间,也就是负责处理客户端的连接请求。而subReactor主要负责已连接描述符connfd上的事件,也就是在和客户端建立好连接之后负责处理和客户端的具体通信。mainReactor+subReactor是由多个IO线程实现的,在muduo库当中,其通过在IO线程池中设置是让其工作在单IO线程模式还是多IO线程模式。而所谓的业务线程池主要是指计算线程池,其主要负责处理具体的业务逻辑,不涉及具体的IO操作。 在认真阅读完一遍muduo库源码之后,我认为如果想基于muduo库编写一个单线程版的echo服务器

socket编程小问题:地址已经被使用——Address already in use

…衆ロ難τιáo~ 提交于 2020-03-02 09:15:02
转自:http://blog.csdn.net/a_tu_/article/details/44625117 很多socket编程的初学者可能会遇到这样的问题:如果先ctrl+c结束服务器端程序的话,再次启动服务器就会出现Address already in use这个错误,或者你的程序在正常关闭服务器端socket后还是有这个问题。正如下面的这段简单的socket程序。 server.cpp 1 #include <sys/types.h> 2 #include <sys/socket.h> 3 #include <stdio.h> 4 #include <netinet/in.h> 5 #include <arpa/inet.h> 6 #include <unistd.h> 7 #include <stdlib.h> 8 9 #define BUFFER_SIZE 40 10 11 int main() 12 { 13 char buf[BUFFER_SIZE]; 14 int server_sockfd, client_sockfd; 15 int sin_size=sizeof(struct sockaddr_in); 16 struct sockaddr_in server_address; 17 struct sockaddr_in client_address; 18

网络编程套接字

徘徊边缘 提交于 2020-03-02 04:30:37
网络字节序 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分。 那么如何定义网络数据流的地址呢? 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出; 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存; 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址; TCP/IP协议规定:网络数据流应采用大端字节序,即低地址高字节; 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据; 如果当前发送主机是小端, 就需要先将数据转成大端,否则就忽略, 直接发送即可。 概念补充: 字节序 :CPU对内存当中的数据进行存取的顺序 大端字节序 :低地址存高位 小端字节序 :低地址存低位 eg: -------------------> 主机字节序 :当前计算机的字节序,一般情况下X86_64机器都是小端机器。 如何判断当前机器是大端还是小端? #include <stdio.h> int main() { union AB { int a; char b; }c; c.a = 1; if(1 == c.b) { printf("当前计算机为小端机器!\n"); } return 0; }

python基础之socket与socketserver

我怕爱的太早我们不能终老 提交于 2020-03-02 02:56:50
---引入 Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’。套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座(ip地址)的房间,每个插座有很多插口(端口),通过这些插口接入电线(进程)我们可以烧水,看电视,玩电脑…… 应用程序通常通过"套接字"向网络发出请求或者应答网络请求 。 套接字的作用之一就是用来区分不同应用进程,当某个进程绑定了本机ip的某个端口,那么所有传送至这个ip地址上的这个端口的所有数据都会被内核送至该进程进行处理。 ---python中的socket Python 提供了两个基本的 socket 模块。 第一个是 Socket,它提供了标准的 BSD Sockets API。 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。 ----socket 先来说第一个。 我们知道,现在的应用程序大多为C/S架构,也就是分为客户端/服务器端。   服务器端:服务器端进程需要申请套接字,然后自己绑定在这个套接字上,并对这个套接字进行监听。当有客户端发送数据了,则接受数据进行处理,处理完成后对客户端进行响应。   客户端:客户端则相对简单些,客户端只需要申请一个套接字,然后通过这个套接字连接服务器端的套接字

socket套接字的学习与简单应用

a 夏天 提交于 2020-03-01 10:46:26
socket套接字 Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口提高了效率 socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。也 为什么存在socket抽象层? 如果直接与操作系统数据交互非常麻烦,繁琐,socket对这些繁琐的的操作高度的封装,简化. socket在python中就是一个模块. 基于文件类型的套接字家族 套接字家族的名字:AF_UNIX unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信 基于网络类型的套接字家族 套接字家族的名字:AF_INET (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET) tcp链接+循环 通信 服务端常驻 server端 import socket phone=socket.socket()#买手机 phone.bind(('127.0.0.1',6666))#绑卡 phone.listen(5)

Python基础知识学习_Day8

醉酒当歌 提交于 2020-03-01 06:03:42
一、类的扩展方法 1.静态方法 语法:@staticmethod,静态方法不能访问公有属性,不能访问类。可在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量。 1 class eat(object): 2 def __init__(self,name): 3 self.name = name 4 @staticmethod #静态方法不能访问共有属性、不能访问实例 5 def eat(name,food): 6 print("%s is eating..%s" %(name,food)) 7 p.eat("alex","food") 2.类方法 语法:@classmethod,只能访问类的公有属性,不能访问实例属性。 1 class Dog(object): 2 name = "我是类变量" 3 def __init__(self,name): 4 self.name = name 5 6 @classmethod 7 def eat(self): 8 print("%s is eating" % self.name) 9 10 11 12 d = Dog("ChenRonghua") 13 d.eat() 14 15 16 #执行结果 17 18 我是类变量 is eating 3.属性方法 语法:@property 把一个方法变成静态属性 1 class

python基础-11 socket,IO多路复用,select伪造多线程,select读写分离。socketserver源码分析

给你一囗甜甜゛ 提交于 2020-03-01 05:34:45
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭) socket和file的区别: file模块是针对某个指定文件进行【打开】【读写】【关闭】 socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】 服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.bind(ip_port) sk.listen(5) while True: print 'server waiting...' conn,addr = sk.accept()#阻塞 client_data = conn.recv(1024) print client_data conn.sendall('不要回答,不要回答,不要回答') conn.close()