一、socket作用
socket----给应用层和传输层之间提供应用程序设计接口(应用编程接口API)。
二、地址结构
1.当应用程序创建套接字时,操作系统会分配一个数据结构来存储该套接字相关信息。
2.使用TCP/IP协议族的网络应用程序声明端点地址变量时,使用结构sockaddr_in
struct sockaddr_in
{
u_char sin_len; //地址长度
u_char sin_family; //地址族
u_cahr sin_port; //端口号
struct in_addr sin_addr; //IP地址
char sin_zer0[8]; //未用(置0)
}
三、常用函数
connect()的参数sd是客户端的套接字,accept的是服务器创建的套接字,调用accept之后会场生成新的套接字(newsocket),此套接字用来和客户端进行通信
1.WSAStartup()
使用socket的应用程序在使用socket之前必须先调用此函数。
- 参数一:指明程序请求的额WinSock版本,高位字节指明副版本,低位字节指明主版本。如:0x102表示2.1版
- 参数二:返回实际的WinSock的版本信息(指向WSADATA结构的指针)
eg:
wVersionRequested = MAKEWORD(2,1)
err = WSAStartup(wVersionRequested, &wsData)
2.WSACleanup()
完成对Socket库的使用时,解除与Socket库的绑定,释放Socket库所占用的系统资源。
3.socket()
创建套接字socket,返回套接字描述符(sd)
形式:sd = sock(protofamily,type,proto). - protofamily = PF_INET(TCP/IP) : 协议族
- type:套接字类型(SOCK_STREAM,SOCK_DGRAM,SOCK_RAW(TCP/IP) — 流式套接字,数据报套接字,SOCK_RAM)
- proto:协议号,0为默认
eg:创建一个流式套接字
struct protoent *p;
p = getprotobyname("tcp");
SOCKET sd = socket(PF_INET,SOCK_STREAM,p->p_proto);
TCP:可靠、面向连接、字节流传输、点对点
UDP:不可靠、无连接、数据包传输
【可靠:使用TCP传输,可以保证数据不会出错、不会丢失、不会乱序,不会多也不会少。
点对点:一个TCP只能连接两者不能连接第三者】
4.Closesocket()
int closesocket(SOCKET sd);
-
关闭套接字sd
-
若是多个进程共享一个套接字,调用此函数将套接字的引用计数减一,减至0才关闭
-
一个进程的多线程对一个套接字的使用无须计数,因为当进程中的一个线程调用closesocket将一个套接字关闭时,该进程的其他线程也将不能访问该套接字。
-
返回值
0:成功;SOCKET_ERROR:失败
5.bind()
int bind(sd,localaddr,addrlen); -
绑定该套接字的本地端点地址:IP地址+端口号
-
参数:
sd:套接字描述符
localaddr:端点地址(结构sockaddr_in) -
客户端一般不必调用bind函数,系统会帮忙调用。
【地址通配符:INADDR_ANY】
四、SOCKET API函数小结
五、调用socket api函数过程(TCP)
S:closesocket(ns).