1.3、基于windows平台的实现
1.3.1、配置环境
在使用windows进行socket网络编程之前,需要先配置所需要的ws2_32.lib。
配置:属性 -> 配置属性 -> 输入 -> 附加依赖项中添加ws2_32.lib
1.3.2、Winsock初始化
在Winsock编程时,首先需要调用WASAtartup函数来设置Winsock版本,并初始化相应的库。
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersopmRequested:指需要用到的Winsock版本信息。lpWSAData:WSADATA结构体变量的地址值。WODR是typedef声明定义的unsigned short类型(若版本为1.2,则1表示主版本号,2表示副版本号,应传递0x0201,使用2.2版本应传递0x0202)
exam:
int main(void)
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling("WSAStartup() error!");
return 0;
}
1.3.3、注销Winsock
int WSACleanup(void);
成功返回0,失败则返回SOCKET_ERROR。一般在程序结束之前调用。
1.4、基于windows的套接字相关函数
1.4.1、创建套接字
SOCKET socket(int af, int type, int protocal);
成功返回套接字句柄,失败则返回INVALID_SOCKET。
1.4.2、绑定套接字
bind函数在windows和linux中相同
int bind(SOCKET s, const struct sockaddr * name, int namelen);
成功返回0,失败则返回SOCKET_ERROR。
1.4.3、监听套接字
listen函数在windows和linux中相同。
int listen(SOCKET s, int backlog);
成功返回0,失败返回SOCKET_ERROR。
1.4.4、接受请求
accept在windows和linux中相同。
SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);
成功返回句柄,失败返回INVALID_SOCKET。
1.4.5、发送连接请求
connect在windows和linux下相同。
int connect(SOCKET s, const struct sockaddr * name, int namelen);
成功返回0,失败返回SOCKET_ERROR。
1.4.6 关闭socket
在windows下需要自己关闭socket连接,需要用到closesocket函数。
int closesocket(SOCKET s);
成功返回0,失败返回SOCKET_ERROR。
1.5、windows下数据传输
linux中将套接字也当作文件,所以无论是创建文件还是套接字都是返回文件描述符。而在windows中则需要区分文件句柄和socket句柄。由于linux中套接字也是文件,所以可以直接通过文件I/O函数read和write来进行数据传输,而windows中则不同,windows中严格区分文件I/O和套接字I/O。所以windows进行数据传输需要用到send和recv函数。
1.5.1、数据传输函数
使用send函数进行数据的传输。
int send(SOCKET s, const char *buf, int len, int flags);
成功返回传输字计数,失败返回SOCKET_ERROR。
s:句柄;buf:保持待传输数据的缓冲地址值;len:要传输的字节数;flags:传输数据时用到的多种选项信息。
1.5.2 接收数据
使用recv函数接受数据。
int recv(SOCKET s, const char * buf, int len, int flags);
成功返回接收的字节数,如果到eof返回0,失败返回SOCKET_ERROR。
s:套接字;buf:数据缓冲;len:最大字节数;flags:接受多种选项信息。