- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
winsock编程超级详解
Socket编程是网络编程的重要组成部分,编写简单的服务端程的程序的一般的步骤如下
第一步:包含WinSocket的头文件和动态链接库(DLL)
#include Winsock2.h
#include windows.h
#pragma comment(lib,ws2_32)
第二步:初始化WSAStartup 在MSDN中WSAStarup的原型如下:
int WSAStartup(
__in WORD wVersionRequested,
__out LPWSADATA lpWSAData
);其中的第一个参数是版本,第二个参数是一个指向WSADATA结构体的指针,代码如下:
WORD Version = MAKEWORD(2,2); //通过MAKEWORD来设定版本,高版本和低版本都为2,也就是限定了版本必须为2
WSADATA wsadata ; //结构体的一个成员 wsadata
//初始化并判断是不是成功,如果成功的话返回的是0,不成功的话返回的值为非0,那么就要使用WSAleanup()函数了
if(WSAStartup(Version,wsadata)){
coutWSAStartup Error!endl;
WSACleanup();
}
第三部,初始化一个Socket,
在MSDN中socket的原型如下
SOCKET WSAAPI socket(
__in int af,
__in int type,
__in int protocol
);
其中第一个参数为网络层协议类型,第二个参数为socket类型,第三个参数为传输层的协议类型,代码如下:
//第一个参数多数时候为AF_INET,第二个参数可以为SOCK_STREAM适用于可信连接,也就是tcp链接,或者为SOCK_DGRAM,适用于UDP协议
第三个参数为传输层协议,如果第二个参数为SOCK_STREAM,这里就为IPPROTO_TCP,如果是SOCK_DGRAM,这里就为IPPROTO_UDP
SOCKET ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(ServerSocket ==INVALID_SOCKET){
coutSocket Failendl;
}
第四步:bind在MSDN中bind的定义如下:
int bind(
__in SOCKET s,
__in const struct sockaddr* name,
__in int namelen
);
第一个参数一个已经初始化的socket,第一个参数为执行sockaddr或者是sockaddr_in的结构体的起始地址,
第三个参数为结构体的大小,代码如下:
sockaddr_in ServerAddr;//定义一个结构体成员,这里使用的是sockaddr_in结构体
ServerAddr.sin_family=AF_INET;//初始化成员的sin_family为AF_INET
ServerAddr.sin_addr.S_un.S_addr=INADDR_ANY;//允许任意的IP地址进行连接
ServerAddr.sin_port=htons(2012);//侦听端口为2012,这里使用了htons函数
//这里需要说明的是需要对第二个参数进行强制类型转换,(LPSOCKADDR)ServerAddr,并且判断是不是bind成功,成功后返回的是为0
if(bind(ServerSocket,(LPSOCKADDR)ServerAddr,sizeof(ServerAddr))){
coutbind Failendl;
}
第五步:侦听在MSDN中listen的原型如下:
int listen(
__in SOCKET s,
__in int backlog
);
依然第一个参数为初始化了的socket,第二个参数为最大允许的连接数,代码如下:
//这里依然使用的是上面的socket:ServerSocket
if(listen(ServerSocket,5)){
coutlisten Failendl;
}
第六步:accept在MSDN中原型如下:
SOCKET accept(
__in SOCKET s,
__out struct sockaddr* addr,
__inout int* addrlen
);
第一个参数一个新的客户端的Socket,这里需要定义一个,第二个参数依然为执行sockaddr或者是sockaddr_in的结构体
文档评论(0)