socket本质是编程接口
- 中文名
- 套接字
- 外文名
- socket
- 英文原义
- “孔”或“插座”
- 中文别称
- 通常也称作"套接字"
- 常用类型
- 流式Socket和数据包式Socket
- 相关模型
- 对等模型、C/S模型
- 相关应用
- C#/C++语言应用
- 区 号
- 它的网络地址
目录
- 1 举例说明
- 2 现象解释
- 3 连接过程
- 4 常用函数
- ▪ 创建
- ▪ 绑定
- ▪ 接收
- ▪ 发送
- ▪ 接收连接请求
- 5 实例
- ▪ C
- ▪ PHP
- ▪ C#
- 6 CPU插槽类型
socket举例说明
编辑
socket现象解释
编辑
Socket非常类似于电话插座。以一个国家级电话网为例,电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于Socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的号码,相当于对方有一个固定的Socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。假如对方在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向Socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭Socket,撤消连接。
socket连接过程
编辑
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
socket常用函数
编辑
socket创建
socket绑定
socket接收
socket发送
socket接收连接请求
socket实例
编辑
socketC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include<winsock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsaData;
SOCKET sockServer;
SOCKADDR_IN addrServer;
SOCKET sockClient;
SOCKADDR_IN addrClient;
WSAStartup(MAKEWORD(2,2),&wsaData);
sockServer=socket(AF_INET,SOCK_STREAM,0);
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //INADDR_ANY表示任何IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //绑定端口6000
bind(sockServer,(SOCKADDR*)&addrServer, sizeof (SOCKADDR));
//Listen监听端
listen(sockServer,5); //5为等待连接数目
printf ( "服务器已启动:\n监听中...\n" );
int len= sizeof (SOCKADDR);
charsendBuf[100]; //发送至客户端的字符串
charrecvBuf[100]; //接受客户端返回的字符串
//会阻塞进程,直到有客户端连接上来为止
sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len);
//接收并打印客户端数据
recv(sockClient,recvBuf,100,0);
printf ( "%s\n" ,recvBuf);
//关闭socket
closesocket(sockClient);
WSACleanup();}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include<winsock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsaData;
SOCKET sockClient; //客户端Socket
SOCKADDR_IN addrServer; //服务端地址
WSAStartup(MAKEWORD(2,2),&wsaData);
//新建客户端socket
sockClient=socket(AF_INET,SOCK_STREAM,0);
//定义要连接的服务端地址
addrServer.sin_addr.S_un.S_addr=inet_addr( "127.0.0.1" ); //目标IP(127.0.0.1是回送地址)
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //连接端口6000
//连接到服务端
connect(sockClient,(SOCKADDR*)&addrServer, sizeof (SOCKADDR));
//发送数据
char message[20]= "HelloSocket!" ;
send(sockClient,message, strlen (message)+1,0);
//关闭socket
closesocket(sockClient);
WSACleanup();}
|
socketPHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
开启一个socket监听示例程序:
<?php //设置一些基本的变量
$host = "192.168.1.99" ;
$port =1234; //设置超时时间
set_time_limit(0);
//创建一个Socket
$socket =socket_create(AF_INET,SOCK_STREAM,0)ordie( "Couldnotcreatesocket\n" ); //绑定Socket到端口
$result =socket_bind( $socket , $host , $port )ordie( "Couldnotbindtosocket\n" ); //开始监听链接
$result =socket_listen( $socket ,3)ordie( "Couldnotsetupsocketlistener\n" ); //acceptincomingconnections
//另一个Socket来处理通信
$spawn =socket_accept( $socket )ordie( "Couldnotacceptincomingconnection\n" ); //获得客户端的输入
$input =socket_read( $spawn ,1024)ordie( "Couldnotreadinput\n" ); //清空输入字符串
$input =trim( $input ); //处理客户端输入并返回结果
$output = strrev ( $input ). "\n" ;
socket_write( $spawn , $output , strlen ( $output ))ordie( "Couldnotwriteoutput\n" ); //关闭
socket_close( $spawn );
socket_close( $socket );
|
socketC#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
public class XmlSocket
{
//异步socket侦听从客户端传来的数据
public static string data= null ;
//Threadsignal.线程用一个指示是否将初始状态设置为终止的布尔值初始化ManualResetEvent类的新实例。
public static ManualResetEvent allDone= new ManualResetEvent( false );
static void Main( string []args)
{
StartListening();
}
public static void StartListening()
{
//传入数据缓冲
byte [] bytes = new Byte[1024];
//建立本地端口
IPAddress ipAddress;
String ipString = ConfigurationManager.AppSettings.Get(“SocketIP”);
if (ipString == null || ipString == String.Empty)
{
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = ipHostInfo.AddressList[0];
}
else
{
ipAddress = IPAddress.Parse(ipString);
}
int port;
String portString = ConfigurationManager.AppSettings.Get(“SocketPort”);
if (portString == null || portString == String.Empty)
{
port=11001;
}
else
{
port= int .Parse(portString);
}
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定端口和数据
listener.Bind(localEndPoint);
listener.Listen(100);
while ( true )
{ //设置无信号状态的事件
allDone.Reset();
//重启异步连接
listener.BeginAccept( new AsyncCallback(AcceptCallback),listener);
//等待连接创建后继续
allDone.WaitOne();
}
public static void AcceptCallback(IAsyncResult ar)
{
//接受回调方法。该方法的此节向主应用程序线程发出信号,让它继续处理并建立与客户端的连接
allDone.Set();
//获取客户端请求句柄
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback),state);
}
//与接受回调方法一样,读取回调方法也是一个AsyncCallback委托。该方法将来自客户端套接字的一个或多个字节读入数据缓冲区,然后再次调用BeginReceive方法,直到客户端发送的数据完成为止。从客户端读取整个消息后,在控制台上显示字符串,并关闭处理与客户端的连接的服务器套接字。
public static void ReadCallback(IAsyncResult ar)
{
String content = String.Empty;
//创建自定义的状态对象
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket; //处理的句柄
//读出
int bytesRead = handler.EndReceive(ar);
if (bytesRead>0)
{
String len = Encoding.UTF8.GetBytes(result).Length.ToString().PadLeft(8,’0′);
log.writeLine(len);
Send(len + result, handler);
}
}
private static void Send( string data, Socket handler)
{
byte [] byteData = Encoding.UTF8.GetBytes(data);
handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);
}
private static void SendCallback(IAsyncResult ar)
{
Socket handler = (Socket)ar.AsyncState;
//向远端发送数据
int bytesSent = handler.EndSend(ar);
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback),state);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
public static void StopListening()
{
allDone.Close();
log.close();
}
|
socketCPU插槽类型
编辑
socket本质是编程接口相关推荐
- socket是一个编程接口
socket是一个编程接口,用于提供通信的一种机制,用于在两台计算机之间进行通信.它可以用于实现网络编程,它提供了一种简单的方法来编写网络应用程序,如Web服务器.FTP服务器.电子邮件服务器等. S ...
- socket编程接口
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封 ...
- 【Linux】详解socket编程接口
socket编程接口详解 1. socket常见API 2. IPv4协议的地址信息结构:sockaddr_in结构体 2.1 sockaddr结构体 2.2 in_addr结构体 2.3 socka ...
- socket网络编程——网络编程接口
网络编程接口 #include <sys/types.h> #include <sys/socket.h>/* socket()创建套接字,成功返回套接字的文件描述符,失败返回 ...
- Android网络功能开发(5)——Socket编程接口
Socket是编写用TCP/IP协议进行通信的程序的API接口,TCP/IP协议是互联网上使用的通信协议,不局限于HTTP的一问一答方式,可以随发随收. JavaSE平台提供了Socket编程接口,A ...
- 朱有鹏 socket编程接口介绍(3)
朱有鹏 socket编程接口介绍(3) 建立连接 socket(man 2 socket) socket()函数类似于open()函数,用来打开一个网络连接,如果成功则返回一个网络文件描述符(int类 ...
- Socket编程-应用编程接口(API)--套接字(及其函数介绍)
文章目录 Socket编程-应用编程接口(API)--套接字 网络程序设计接口 应用编程接口 API 几种典型的应用编程接口 Socket编程-Socket API概述 Socket API 套接字就 ...
- Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...
TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...
- 使用 COM 风格的编程接口
使用COM 风格的编程接口 假设不直接使用 COM 库.不创建自己的包装.那么更可能的是使用 COM 风格的编程接口.这是由于如今很多开发商公布应用程序时.提供了首选的互操作程序集(Primary ...
最新文章
- UVa10375 Choose and divide
- 利用?和 ??简化界面的默认配置/自定义配置
- swift 网络请求中含有特殊字符的解决方案
- leetcode1414. 和为 K 的最少斐波那契数字数目(贪心算法)
- 程序员一定要提升技术之外的能力
- java特定用户登录_求教!!!用 jsp+servlet 怎样控制指定用户名登录页面啊!
- 海康威视 摄像头 RTMP 转 FLV
- 如何监测土壤pH值和水分含量
- 基于JAVA的企业OA办公系统
- 计算机网络.第三节课.笔记.信道复用、频分复用、统计时分复用、波分复用、时分复用、码分复用、双绞线带宽、双绞线
- 车载蓝牙通话支持电话本PBAP功能的说明
- 【105】百度脑图-在线思维导图工具
- fluent使用DPM模型计算出的颗粒沉积(trap)数据(.dpm格式)后处理python实现
- stm32智能小车设计
- ArcGIS面矢量挖洞
- 如何简单粗暴的干掉2345主页
- Premature optimization is the root of all evil.
- 一、计算机基础: 特点、数制、编码、组成
- ChatGPT,背后的核心是什么?
- 新闻主题分类任务——torchtext 库进行文本分类
热门文章
- 这件事有了新进展 | 经济学人20210529期下载
- 黎曼猜想(二)全体自然数之和等于-1/12和解析延拓
- plc远程服务器,PLC远程控制
- 网易视频云:HBase BlockCache系列-性能对比测试报告
- 创建Oracle数据库和表
- 惊呆了!手机上居然能安装Win10电脑系统?效果炸裂....附方法!这波操作我服气!
- 使用arcgis和QGIS绘制采样点图
- python bp神经网络 异或_两层神经网络输出异或
- python中怎么创建一个词典_如何在Python中创建字典词典
- 计算机专业考博入学考试科目,北京航空航天大学计算机应用技术考博考试科目.doc...