Socket编程原理

更新时间:2023-09-05 02:41:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

网络编程TCP socket & UDP socket

10/31/2011

Socket 简介1982 - Berkeley Software Distributions 操作 系统引入了sockets 作为本地进程之间通信的 接口 1986 - Berkeley 扩展了socket 接口使之支持 UNIX 下的TCP/IP 通信 现在很多应用 (FTP, Telnet, etc) 都依赖这一 接口

10/31/2011

Socket 简介 简介(2)Socket 是一个编程接口 是一种特殊的文件描述符 (everything in Unix is a file) 并不仅限于TCP/IP 通信协议 面向连接 (Transmission Control Protocol - TCP/IP) 无连接 (User Datagram Protocol -UDP 和 Internetwork Packet Exchange - IPX)

10/31/2011

WinSock从 Berkeley Sockets (Unix)移植包括了许多对windows环境的扩展支持

开放的网络编程接口API 开放 多个厂商提供 winsock 源码和二进制兼容性

最初的Winsock版本是1.1版,在它的基础 上,微软又进一步提供了Winsock2接口。 Winsock2支持多种底层的网络协议,如 TCP/IP、ATM、IPX等10/31/2011 4

Windows Socket, 协议 和应用Application

WinSock.dll

FTP WinSock.dll

Remote Access Service (RAS) TCP/IP IPX AppleTalkNetBIOS

FTP TCP/IP

Modem Phone Line10/31/2011

Network Drivers

LAN5

初始化 Winsockvoid main (void) { /* The following two lines needed for Window's socket */ WORD wVersionRequested = MAKEWORD(2,2); /* WSA 函数的参数 */ WSADATA wsaData; /* WSA 函数的参数 */

Step 1: 指定需要使用的Winsock规范的最高版本 Winsock version 2.2

/* 初始化 winsock */ WSAStartup(wVersionRequested, &wsaData); /* Create a socket */ My_SocketID = socket ( ….. );10/31/2011

Step 2: 初始化 Winsock,装入 Winsock.dll Step 3: 开始使用

Winsock DLL在装入Winsock DLL 之前调用任何 Winsock 函数都会返 回 SOCKET-ERROR 错误. 调用 WSAStartup装入Winsock DLLint WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );

wVersionRequested Winsock DLL versionX (high order): sub-version Y (low order): main version MAKEWORD(X,Y)宏定义将两个字节组装成一个WORD10/31/2011 7

Clear winsock在调用 “closesocket” 函数之后 但是在程序结束之前

/* This stuff cleans-up winsock */ WSACleanup( );

10/31/2011

socket ( ) 函数Returns socket ID on success Return INVALID_SOCKET on error

SOCKET socket_id = socket (AF_INET, SOCK_STREAM, 0);“AF_INET” = 使用 IP 协议 “SOCK_STREAM” = 使用 TCP 总是 0

10/31/2011

Basic Socket Calls (socket)// Berkeley 形式 int socket(int family int type, int protocol); // WinSock 形式 SOCKET socket (int family, int type, int protocol);10/31/2011 10

socket (续) 续SOCKET socket (int family, int type, int protocol);

family 是地址族 AF_INET // internet 协议 AF_UNIX // unix internal协议 AF_NS // Xerox NS协议 AF_IMPLINK // Interface Message协议 type SOCK_STREAM // 流式 socket SOCK_DGRAM // 数据报 socket SOCK_RAW // raw socket

protocol 参数通常置为010/31/2011 11

TCP Sockets 编程创建一

个被动模式 (server,服务器)的 socket. 建立应用层的连接 Client/Server 交互在发送和接收数据之前 client 必须调用 connect 连接服务器 server 必须调用 accept 接收client的连接

发送和接收数据. 关闭连接.10/31/2011 12

socket() TCP Sockets 编程基本流程Client

bind() listen() accept()

socket() connect() send()建立连接 数据请求

Server

recv()

recv() close()10/31/2011

数据响应 断连指示

send() recv() close()13

socket()服务器端调用socket创建一个套接字,并在传输层 创建一个套接字, 调用 创建一个套接字 实体中分配表空间,返回一个文件描述符, 实体中分配表空间,返回一个文件描述符, 用于以后调用中使用。 用于以后调用中使用。

bind() listen()

调用bind将某地址赋予,使得远程应用程 将某地址赋予, 调用 将某地址赋予 序能访问本地应用程序。 序能访问本地应用程序。

调用listen分配数据空间,以便存 分配数据空间, 调用 分配数据空间 储多个用户的连接建立请求。 储多个用户的连接建立请求。

accept()

调用accept将本地应用程序阻塞起来, 将本地应用程序阻塞起来, 调用 将本地应用程序阻塞起来 等待接收客户端发来的连接请求。 等待接收客户端发来的连接请求。

close()10/31/2011

释放连接:使用 释放连接:使用close原语单独释放连 原语单独释放连 接。

客户端

socket()调用socket创建一个套接字,并在传输 创建一个套接字, 调用 创建一个套接字 层实体中分配表空间, 层实体中分配表空间,返回一个文件描 述符,用于以后调用中使用。 述符,用于以后调用中使用。

connect()调用connect阻塞应用程序,传输层实 阻塞应用程序, 调用 阻塞应用程序 体开始建立连接,当连接建立完成时, 体开始建立连接,当连接建立完成时, 取消阻塞。 取消阻塞。

close()释放连接:使用 释放连接:使用close原语单独释放连 原语单独释放连 接。10/31/2011 15

数据传输

send()

数据请求

recv()

recv() recv

数据响应

send() send

双方使用send和receive完成 和 双方使用 完成 数据的全双工发送

10/31/2011

Bind ( ) 函数Return code (SOCKET_ERROR if error) Socket ID returned by socket function int status = bind (socket_id, (struct sockaddr_in *) my_addr, sizeof(my_addr)); sockaddr_in 结构, 描述本机的端口和 IP 地址

Sockaddr_in 结构 的字节长度10/31/2011 17

Basic Socket Calls (bind)// Berkeley 形式 int bind(int sockfd, struct sockaddr* addr, int addrLen); // WinSock 形式 int bind(SOCKET sockfd, struct sockaddr* addr, int addrLen);

10/31/2011

bind (续) 续int bind (SOCKET sockfd, struct sockaddr* addr, int ad

drLen); sockfd 由socket() 调用返回 addr 是指向 sockaddr_in 结构的指针,包含 server IP 地址和端口号struct sockaddr_inshort sin_family // address family u_short sin_port // port number struct in_addr sin_addr //IP address (32-bits)

addrLen - sizeof (struct sockaddr_in)10/31/2011 19

本文来源:https://www.bwwdw.com/article/fd6i.html

Top