网络编程之TCP-IP socket编程

两个网络程序之间需要通信就需要在他们之间建立一个链接通道,这个通道就是由一个五元组组成。即是:协议、
首页 新闻资讯 行业资讯 网络编程之TCP-IP socket编程

两个网络程序之间需要通信就需要在他们之间建立一个链接通道,这个通道就是由一个五元组组成。

五元组:(协议、本地IP地址、本地端口号、远程IP地址、远程端口号)

socket编程原理

socket套接口

网络程序之间通信是依靠socket套接口进行通信。

例如:主机A上面的QQ程序需要发送消息到主机B上面的QQ,步骤就是:

①主机A上面的QQ发消息存到主机A上面的socket中

②这个socket通过主机A的网络管理软件通过网络接口卡传到主机B中得网络接口卡

③主机B的网络接口卡接收到消息后再传给主机B的网络管理软件再传到主机B的socket中。

④然后主机B中得QQ读取socket中得信息

套接口分类

①流式套接口(SOCK_STREAM)可靠的面向连接的数据传输服务(适用于TCP)

②数据报套接口(SOCK_DGRAM)无连接不可靠的双向数据传输服务(使用与UDP)

③原始套接口(SOCK_RAM)很少用

socket编程原理

①服务端调用socket()函数开启一个服务,就是创建一个套接口

②这个socket条用bind()函数把一个端口跟这个socket绑定

③调用listen()函数监听客户端的请求

④客户端也调用socket()函数穿件一个请求服务的套接口,然后调用connect()函数请求连接

⑤服务端调用accept()函数接收请求连接,然后使用recv()函数从套接口读数据,调用send()函数向套接口发送数据

⑥关闭套接口资源#p#

winsock API套接口连接的建立

①WSAStartup()检查协议栈的安装情况

②socket()函数创建套接口socket

复制

SOCKET socket (
int af,//地址族AF_INET
int type,//套接口类型SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
int protocol//协议字段IPPROTO_TCP, IPPROTO_UDP
)12345
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

③bind()绑定本地地址,就是把一个套接口与主机地址和端口号联系起来。没有错误返回0

复制

int bind(
SOCKET s,//套接口
const struct sockaddr FAR* name,//IP地址和端口地址
int namelen//地址参数的长度
)12345
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

关于地址参数

复制

struct sockaddr_in {
short sin_family;//必须是AF_INET
u_short sin_port;//16位端口号
struct in_addr sin_addr;//IP地址
char sin_zero[8];//一般是0
}123456
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

④监听连接 listen() 当一个套接口创建好后,然后绑定好,就该调用listen()函数监听连接请求了,没有错误返回0

复制

int listen(
SOCKET s,//已绑定了地址,还没有建立连接的套接口
int backlog//指定正在等待连接的***队列长度
)1234
  • 1.

  • 2.

  • 3.

  • 4.

⑤请求连接connect() 客户端套接口创建好以后就可以调用这个函数进行连接

复制

int connect(
SOCKET s,
const struct sockaddr FAR* name,
int namelen
)12345
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

⑥接收连接accept() 服务器接收客户端的连接请求

复制

SOCKET accept(
SOCKET s,//处于监听状态的套接口
struct sockaddr FAR* addr,//用来存放发出连接的那个客户端的IP地址信息
int FAR* addrlen//客户端接口地址的长度
)12345
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

#p#

winsock API基本数据传输

TCP使用的数据传输函数

①send()函数,在已连接的套接口上发送数据

复制

int send(
SOCKET s,//已建立连接的套接口
const char FAR*buf,//字符缓冲区,内有将要发送的数据
int len,//即将发送的缓冲区的字符数
int flags//控制传输方式,可以是0
)123456
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

②recv()函数,从套接口接收数据

复制

int recv(
SOCKET s,//已建立的套接口
char FAR* buf,//用于接收数据的缓冲区
int len,//缓冲区的长度
int flags//调用方式 ,正常为0
)123456
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

UDP使用的数据传输函数

①recvfrom()接收数据

复制

int recvfrom(
SOCKET s,//一个套接口
char FAR* buf,//接收数据的缓冲区
int len,//缓冲区长度
int flags,//调用操作方式
struct sockaddr FAR* from//源地址,向谁要信息
int FAR* fromlen//
)12345678
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

②sendto()发送数据

复制

int sendto(
SOCKET s,//套接口
const char FAR* buf,//将要发送数据的缓冲区
int len,//buf缓冲区长度
int flags,//调用方式
const struct sockaddr FAR* to,//目的套接口地址
int tolen//to所指地址长度
)12345678
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

#p#

winsock API连接与关闭套接口

①shutdown()关闭读写通道

复制

shutdown(
SOCKET s,//套接口
int how//关闭时禁止那种操作
)1234
  • 1.

  • 2.

  • 3.

  • 4.

②colsesocket()关闭套接口

复制

int closesocket(
SOCKET s
)123
  • 1.

  • 2.

  • 3.

③WSACleanup()终止使用winsock

复制

int WSACleanup();
  • 1.

13    2015-04-24 09:48:59    TCP socket socket编程