本节先引出概念,具体的函数参数以及网络编程会在后续讲解
服务器端套接字创建
1.调用socket函数创建套接字
int socket(int domain,int type,int protocol);
2.调用bind函数分配ip地址和端口号
int bind(int sockfd,struct sockaddr* myaddr,socklen_t addrlen);
3.调用listen函数转为可接收请求的状态
int listen(int sockfd,int backlog);
4.调用accept函数受理链接请求
int accept(int sockfd,struct sockaddr* addr,socklen_t* addrlen);
客户端套接字
1.调用socket创建套接字
2.调用connect函数向服务器发送请求链接
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
基于Windows平台的实现
准备
-
导入头文件winsock2.h
-
链接ws2_32.lib库
在配置属性附加依赖项中添加ws2_32.lib
Winsock的初始化
int WSAStaruo(WORD wVersionRequested,LPWSADATA lpWSADATA);
参数:wVersionRequested用来指定winsock的版本。可以通过MAKEWORD宏函数来构建版本信息
MAKEWORD(1,2) //版本号为1.2
lpWASDATA需要传入WSADATA结构体变量的地址
int WSACleanup(void);
该函数将Winsock相关库归还给Windows操作系统,无法再调用Winsock相关函数
基于Windows的套接字函数
SOCKET socket(int af,int type,int protocol);
SOCKET accept(SOCKET s,struct sockaddr* addr,int* addrlen);
int closesocket(SOCKET s);
我们会发现,Windows中的socket句柄为SOCKET。这个句柄就相当于Linux中的文件描述符。其他的函数都与Linux相似
基于Windows的I/O函数
Windows需要严格区分文件I/O和套接字I/O函数
int send(SOCKET s,const char* buf,int len,int flags);
s:套接字句柄
buf:待传输数据的缓冲地址值
len:要传输的字节数
flags:参数
成功返回传输字节数,失败返回SOCKET_ERROR
int recv(SOCKET s,const char* buf,int len,int flags);
buf:保存数据的缓冲地址值
len:能接受的最大字节数