和服务端原理差不多,只是少了两个步骤.
客户端:
初始化套接字(WSAStartup)->创建套接字(socket)->连接服务器(connect)->发送/接收数据(send/recv)->关闭连接(closesocket,WSACleanup)
1.初始化套接字,也是获取套接字.
WSADATA是一个存放套接字信息的结构
利用WSAStartup函数来获取套接字信息并且存放到WSADATA
//成功返回0,失败返回非零
int WSAStartup(
WORD wVersionRequested, //需要的版本
LPWSADATA lpWSAData //套接字信息结构
);
获取到套接字信息后还要判断是否获取的是2.2版本的.
方法如下:
//判断版本
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("wVersion was not 2.2\n");
return -1;
}
2.创建套接字
//成功返回一个套接字,失败返回INVLID_SOCKET
SOCKET socket(
int af, // AF 表示ADDRESS FAMILY 地址族
int type, //套接字的类型
int protocol//使用的传输协议
);
其中af的值可以是如下几个常用的:
AF_UNIX(本机通信)
AF_INET(TCP/IP – IPv4)
AF_INET6(TCP/IP – IPv6)
type的值可以是如下几个:
SOCK_STREAM(TCP流)
SOCK_DGRAM(UDP数据报)
SOCK_RAW(原始套接字)
注意:客户端的af,type都要和服务器的一样
3.连接服务器
//成功返回0,失败返回SOCKET_ERROR
int connect(
SOCKET s, //客户端套接字
const struct sockaddr FAR* name,//服务器地址
int namelen //长度
);
4.发送/接收数据
//成功返回发送的bytes失败返回SOCKET_ERROR
int send(
SOCKET s, //第二步创建的套接字
const char FAR* buf,//要发送的数据
int len, //数据的长度
int flags //设为0
);
//成功返回接受到的bytes,连接关闭则返回0,失败返回SOCKET_ERROR
int recv(
SOCKET s, //第二步创建的套接字
char FAR* buf,//接收数据的缓存区
int len, //缓存区大小
int flags //设为0
);
5.关闭所有连接并清理
`
//成功返回0,失败返回SOCKET_ERROR
int closesocket(
SOCKET s
);
WSACleanup();//清理