网络编程(4)—— 基于Windows系统的socket客户端的编程步骤
2016-02-20 12:26
495 查看
socket客户端编程的基本步骤:
vVersionRequested--Winsock的版本,通常用传入MAKEWORD,如MAKEWORD(2,2)表示主版本号2,副版本号2
lpWSAData--WSADATA结构体变量的地址,调用该函数后用来填充柄库的初始化信息
返回值--成功返回0,失败返回其他错误值
af--通信协议族,常用的AF_INET,AF_INET6等
type--通信类型,SOCK_STREAM面向连接的可靠的传输方式;SOCK_DGRAM面向消息的非可靠的传输方式。
protocol--协议类型,通常为0
返回值--成功返回创建的SOCKET句柄,失败返回INVALID_SOCKET
s--服务器端的SOCKET句柄
name--保存服务器端通信信息的结构体变量
namelen--上述结构体变量的长度
返回值--成功返回0,失败返回SOCKET_ERROR
s--服务器端SOCKET句柄
buf--接收数据的buffer
len--上述buffer的长度
flags--用于接收数据的其他选项
返回值--成功返回0,失败返回SOCKET_ERROR
s-SOCKET句柄
返回值--成功返回0,失败返回socket_ERROR
返回值--成功返回0,失败返回SOCKET_ERROR
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL04
1.1 导入ws2_32.lib静态链接库
在项目属性->配置属性->链接器->输入->附加依赖项中添加ws2_32.lib。1.2 初始化Winsock相关库
int WSAStartup(WORD vVersionRequested,LPWSADATA lpWSAData)vVersionRequested--Winsock的版本,通常用传入MAKEWORD,如MAKEWORD(2,2)表示主版本号2,副版本号2
lpWSAData--WSADATA结构体变量的地址,调用该函数后用来填充柄库的初始化信息
返回值--成功返回0,失败返回其他错误值
1.3 创建socket
SOCKET socket(int af,int type,int protocol);af--通信协议族,常用的AF_INET,AF_INET6等
type--通信类型,SOCK_STREAM面向连接的可靠的传输方式;SOCK_DGRAM面向消息的非可靠的传输方式。
protocol--协议类型,通常为0
返回值--成功返回创建的SOCKET句柄,失败返回INVALID_SOCKET
1.4 连接服务器端
int connect(SOCKET s,const struct sockaddr* name,int namelen);s--服务器端的SOCKET句柄
name--保存服务器端通信信息的结构体变量
namelen--上述结构体变量的长度
返回值--成功返回0,失败返回SOCKET_ERROR
1.5 接收数据
int recv(SOCKET s,char* buf,int len,int flags);s--服务器端SOCKET句柄
buf--接收数据的buffer
len--上述buffer的长度
flags--用于接收数据的其他选项
返回值--成功返回0,失败返回SOCKET_ERROR
1.6 关闭SOCKET
int closesocket(SOCKET s);s-SOCKET句柄
返回值--成功返回0,失败返回socket_ERROR
1.7 注销Winsock相关库
int WSACleanup();返回值--成功返回0,失败返回SOCKET_ERROR
示例代码: #include<stdio.h> #include<stdlib.h> #include<winsock2.h> void error_handling(char* message) { fputs(message,stderr); fputc('\n',stderr); exit(1); } int main(int argc,char* argv[]) { WSADATA wsaData; SOCKET hSocket; SOCKADDR_IN servAddr; char message[30]; int strlen; if(argc!=3) { printf("Usage : %s <ip> <port>\n",argv[0]); exit(1); } if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) error_handling("WSAStartup error"); hSocket=socket(PF_INET,SOCK_STREAM,0); if(hSocket==INVALID_SOCKET) error_handling("socket error"); memset(&servAddr,0,sizeof(servAddr)); servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=inet_addr(argv[1]); servAddr.sin_port=htons(atoi(argv[2])); if(connect(hSocket,(SOCKADDR*)&servAddr,sizeof(servAddr))==SOCKET_ERROR) error_handling("connect error"); strlen=recv(hSocket,message,sizeof(message)-1,0); if(strlen==-1) error_handling("recv error"); printf("Message from server: %s\n",message); closesocket(hSocket); WSACleanup(); return 0; }
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL04
相关文章推荐
- 网络编程(3)—— 基于Windows系统的socket服务器端的编程步骤
- Java NIO之TCP
- 检测网络连接具体类型:2g/3g/4g(iOS7+)
- 网络营销人员如何培养创新技能
- Xcode7、iOS9网络访问权限问题
- ubuntu14.04网络设置
- ubuntu14.04网络设置
- NanoHTTPD web server的一个简单荔枝
- 网络第一道防线:验证码的故事[安全篇]
- 《PYTHON源码剖析》的第十二章:Python虚拟机中的类机制 http://blog.sina.com.cn/s/blog_75984e830100yf3i.html
- 【BZOJ 1491】 [NOI2007]社交网络
- WinHTTP C/C++ API Reference
- [深入Python]sys.modules http://www.cnblogs.com/tuzkee/p/3540448.html
- java高性能 tcp协议代码示例(一)
- Java TCP 简单实例
- HttpServlet类详解
- IOS alamofire网络请求
- 深度学习系列(3)——使用神经网络去辨识手写数字
- 软考之路(1)——浅解网络基础知识
- Https(SSL/TLS)原理详解