创建客户端与创建服务器流程类似,只是有稍许不同,我在这里不详细叙述。
创建客户端流程
1、初始化套接字库
初始化套接字库代码:
WSAData data;//定义WSAData变量
WOED wVersionRequested=MAKEWORD(2,0);//定义套接字库版本号
::WSAStartup(wVersionRequested,&data);//初始化套接字库
2、创建套接字句柄
创建套接字句柄代码:
SOCKET s;//定义套接字句柄
s=::socket(AF_INET,SOCK_STREAM,0);//创建并返回套接字句柄
3、地址结构设置及字节顺序转换
地址结构设置及字节顺序转换代码:
sockaddr_in addr;//定义套接字地址结构变量
in_addr in_add;//定义IP地址结构变量
addr.sin_fimily=AF_INET;//指定地址家族为TCP/IP
addr.sin_port=htons(80);//指定端口号
addr.sin_addr.S_un.S_addr=inet_addr(‘127.0.0.1‘);//将字符串IP转换为网络字节顺序排列的IP
char address[]=inet_ntoa(addr.sin_addr.S_un.S_addr)//将网络字节顺序排列的IP转换为字符串IP
4、发送连接请求
发送连接请求代码
::connect(s,(sockaddr*)&addr,sizeof(addr));
5、数据收发
数据收发代码:
::send(s1,sztext,sizeof(sztext),0);
::recv(s,sztext,sizeof(sztext),0);
6、关闭套接字
关闭套接字代码:
::closesocket(s);
7、释放套接字库
释放套接字库代码:
::WSACleanup();
完整源码:
/*Client.cpp*/
#include <winsock2.h>//包含头文件
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"WS2_32.lib")//显式连接套接字库
int main(){
//初始化套接字库
WSADATA data;//定义WSADATA结构体对象
WORD w=MAKEWORD(2,0);//定义版本号
::WSAStartup(w,&data);//初始化套接字库
char sztext[10]={0};
//创建套接字句柄
SOCKET s;//定义连接套接字和数据收发套接字句柄
s=::socket(AF_INET,SOCK_STREAM,0);//创建TCP套接字
//地址结构设置及字节转换
sockaddr_in addr;//定义套接字地址结构
addr.sin_family=AF_INET;//初始化地址结构
addr.sin_port=htons(75);//设置端口号
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
printf("客户端已经启动\r\n");//输出提示信息
//发送连接请求
::connect(s,(sockaddr*)&addr,sizeof(addr));
//接收服务器的数据
::recv(s,sztext,sizeof(sztext),0);
printf("%s\r\n",sztext);
//关闭套接字句柄
::closesocket(s);
//释放套接字库
::WSACleanup();
if(getchar()){
return 0;
}else{
::Sleep(100);//应用休眠0.1秒
}
}
WinsockPragramming(2) Client(C++版)
原文地址:http://blog.csdn.net/qq_16912257/article/details/46288293