scoket:
是一种抽象层,应用程序通过它来发送和接收数据,使用socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。
简单来说,scoket提供了程序内部与外界通道的端口并为通信双方提供了数据传输通道。
常用函数:
WSAStartup(MAKEWORD(2,2),&wsd):初始化套接字
声明调用不同的Winsock版本,上例就是调用的2.2版,例如1.1版只支持Tcp/Ip协议,而2.0版可支持多协议,此外winsock 2.0支持异步 1.1不支持异步
&wsd:保存socket执行信息的一个数据结构
socket()函数: 用于创建一个socket描述符(socket descriptor),它唯一标识一个socket
(1)原型:int socket(int domain ,int type, int protocol);
(2)参数
domain:又称为协议族family,常见的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket,可用来本地进程间的通信)。用来区分是创建ipv4的套接字(AF_INET)还是ipv6的套接字(AF_INET6).
type:指定socket类型,常见的类型有SOCK_STREAM(创建面向连接的流式套接字)、SOCK_DGRAM(创建面向无连接的数据包套接字)、SOCK_RAW(提供单一的网络访问,使用ICMP公共协议)
protocol:常用的公共协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议
注意:上面的type和protocol不是可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议。
bind()函数: 将特定的ip地址,port端口号绑定到socket上
(1)原型: int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(2)参数: sockfd(即socket描述字它是通过socket()函数创建了,唯一标识一个socket)
addr(一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址,包含有关你的地址的信息:名称、端口和IP 地址)
addrlen:对应的是地址的长度。
listen()函数: 调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求
(1)原型: int listen(int sockfd, int backlog);
(2)参数: sockfd 是一个套接字描述符,为要监听的socket描述字。
backlog表示等待连接的最大队列状态。
注意:socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。
connect()函数: 客户端通过调用connect函数来建立与TCP服务器的连接
(1)原型: int connect (int sockfd, struct sockaddr *serv_addr, int addrlen);
(2)参数: sockfd :套接字文件描述符,由socket()函数返回的,此中为客户端的sockfd。
serv_addr 是一个存储远程计算机的IP 地址和端口信息的结构,一般为服务器的ip与port的结构。
serv_addr 是一个存储远程计算机的IP 地址和端口信息的结构,一般为服务器的ip与port的结构。
addrlen 应该是sizeof(struct sockaddr)表示缓冲区的长度。
accept()函数:用于接收客户端的链接
(1)原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
(2)参数:sockfd :一个套接字标志应该处于监听状态;
addr:包含一组客户端的端口和地址信息
addrlen:sizeof(struct sockaddr_in)用于接收参数addr的长度
send()函数:用于在面向连接方式的套接字间发送数据
(1)原型: size_t send(int sockfd,constvoid *buf, size_t len,int flags);
(2)参数: sockfd:发送端套接字描述符(非监听描述符)
buf:应用要发送数据的缓存
len:实际要发送的数据长度
flag:表示函数的调用方式 一般设置为0
recv()函数:用于从面向连接的套接字中接收数据
(1)原型: ssize_t recv(int sockfd,void *buf, size_t len,int flags);
(2)参数:sockfd:接收端套接字描述符;
buf:指定缓冲区地址,用于存储接收数据;
len:指定的用于接收数据的缓冲区长度;
flags:表示函数的调用方式一般指定为0
close()函数: 套接字将不会在允许进行读操作和写操作。任何有关对套接字描述符进行读和写的操作都会接收到一个错误。
(1)原型: int close(int sockfd);
WSACleanup函数:用于释放从Ws2_32.dll动态连接库初始化分配的资源