精通windows socks网络开发--基于visual C++实现
2012-09-19 20:14
465 查看
1,在开发中应该根据具体情况,选择相应的windows sockets版本,导入wscok32.lib有两种方法:
头文件引用:
#pragma comment(lib,"wsock32.lib)
2.80是HTTP通信端口,21是FTP通信端口;
3,INVALID_SOCKET不是一个有效的套接字;
所以判断是否成功创建套接字的方法:
SOCKET s =socket(....);
If(INVALID_SOCKET==s)
{//失败}
4,从容关闭:一方即使关闭连接,但对方仍然可以读取网络堆栈中的数据。
5,广播数据是指某主机发出数据,局域网内的所有主机都能收到该数据,这个特征适用于面向无连接的协议。
一般情况下,路由器不会传播广播数据;
6,windows sockets提供了与协议无关的编程接口;每种协议都有一套不同的定址方案;
7,TCP和UDP协议通过IP协议传输数据,windows sockets通过AF_INET地址家族为IP通信定址;A代表address,F代表family
8,SOCKADDR_IN结构被用来指定IP地址和端口号;里面有个结构体
Struct in_addr sin_addr; //in_addr类型的IP地址
9,htonl()函数和htons()实现从主机字节顺序转换为网络字节顺序的功能;
H代表主机host,n代表net网络,l代表long,s代表short,to转换
10,开发windows sockets应用程序时,必须首先加载windows sockets 动态库(DLL),
WSAStartup()函数,必须调用的第一个函数;
IntWSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
wVersionRequested:指定准备加载windows sockets动态库的版本,高字节指定所需要库文件的副版本,低字节指定主版本,在应用程序中使用MAKEWORD(X,Y),其中X是高位字节,Y是地位字节;
下面是一个仅支持windows sockets2.2版本的应用程序调用WSAStartup()函数的过程;
#include<winsock2.h>
#include<iostream>
using namespacestd;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int nErrCode;
wVersionRequested=MAKEWORD(2,2);
nErrCode=WSAStartup(wVersionRequested,&wsaData);
if (nErrCode !=0)
{
return1;
}
if (LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return0;
}
return 0;
}
11.bind(套接字,地址,sockaddr结构长度)函数
如果应用程序不关心分配给它的地址,则可将地址设置为INADDR_ANY;
SOCKET s; //套接字
struct sockaddr_in servAddr; //服务器套接字地址
int nServPort=5500; //服务器端口
int nErrCode; //错误代码
//定义服务器地址
servAddr.sin_family=AF_INET;
servAddr.sin_addr.S_addr=htonl(INADDR_ANY);
servAddr.sin_family=htons(nServPort);
//绑定套接字
nErrCode =bind(s,(SOCKADDR*)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR == nErrCode)
{
//绑定套接字失败
}
12,accept()函数的用法:接受一个连接请求的功能;
SOCKET sListen; //监听套接字
SOCKET sAccept; //接受套接字
sockaddr_in addrClient; //客户端地址;
int addrClient = sizeof(addrClient); //长度
//接受客户端请求
sAccept =accept(sListen,(SOCKADDR*)&addrClient, &addrClient);
if (INVALID_SOCKET == sAccept)
{
//失败处理
}
13,
SOCKETs; //套接字
u_longulServIP; //服务器IP
u_shortusServPort; //服务器端口
int retVal; //返回值
//服务器地址
SOCKADDR_IN servAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_addr.S_un.S_addr= htonl(ulServIP);
servAddr.sin_port= htons(usServPort);
intnServLen= sizeof(servAddr);
//连接服务器
retVal= connect(s,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR== retVal)
{
//失败处理
}
头文件引用:
#pragma comment(lib,"wsock32.lib)
2.80是HTTP通信端口,21是FTP通信端口;
3,INVALID_SOCKET不是一个有效的套接字;
所以判断是否成功创建套接字的方法:
SOCKET s =socket(....);
If(INVALID_SOCKET==s)
{//失败}
4,从容关闭:一方即使关闭连接,但对方仍然可以读取网络堆栈中的数据。
5,广播数据是指某主机发出数据,局域网内的所有主机都能收到该数据,这个特征适用于面向无连接的协议。
一般情况下,路由器不会传播广播数据;
6,windows sockets提供了与协议无关的编程接口;每种协议都有一套不同的定址方案;
7,TCP和UDP协议通过IP协议传输数据,windows sockets通过AF_INET地址家族为IP通信定址;A代表address,F代表family
8,SOCKADDR_IN结构被用来指定IP地址和端口号;里面有个结构体
Struct in_addr sin_addr; //in_addr类型的IP地址
9,htonl()函数和htons()实现从主机字节顺序转换为网络字节顺序的功能;
H代表主机host,n代表net网络,l代表long,s代表short,to转换
10,开发windows sockets应用程序时,必须首先加载windows sockets 动态库(DLL),
WSAStartup()函数,必须调用的第一个函数;
IntWSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
wVersionRequested:指定准备加载windows sockets动态库的版本,高字节指定所需要库文件的副版本,低字节指定主版本,在应用程序中使用MAKEWORD(X,Y),其中X是高位字节,Y是地位字节;
下面是一个仅支持windows sockets2.2版本的应用程序调用WSAStartup()函数的过程;
#include<winsock2.h>
#include<iostream>
using namespacestd;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int nErrCode;
wVersionRequested=MAKEWORD(2,2);
nErrCode=WSAStartup(wVersionRequested,&wsaData);
if (nErrCode !=0)
{
return1;
}
if (LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return0;
}
return 0;
}
11.bind(套接字,地址,sockaddr结构长度)函数
如果应用程序不关心分配给它的地址,则可将地址设置为INADDR_ANY;
SOCKET s; //套接字
struct sockaddr_in servAddr; //服务器套接字地址
int nServPort=5500; //服务器端口
int nErrCode; //错误代码
//定义服务器地址
servAddr.sin_family=AF_INET;
servAddr.sin_addr.S_addr=htonl(INADDR_ANY);
servAddr.sin_family=htons(nServPort);
//绑定套接字
nErrCode =bind(s,(SOCKADDR*)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR == nErrCode)
{
//绑定套接字失败
}
12,accept()函数的用法:接受一个连接请求的功能;
SOCKET sListen; //监听套接字
SOCKET sAccept; //接受套接字
sockaddr_in addrClient; //客户端地址;
int addrClient = sizeof(addrClient); //长度
//接受客户端请求
sAccept =accept(sListen,(SOCKADDR*)&addrClient, &addrClient);
if (INVALID_SOCKET == sAccept)
{
//失败处理
}
13,
SOCKETs; //套接字
u_longulServIP; //服务器IP
u_shortusServPort; //服务器端口
int retVal; //返回值
//服务器地址
SOCKADDR_IN servAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_addr.S_un.S_addr= htonl(ulServIP);
servAddr.sin_port= htons(usServPort);
intnServLen= sizeof(servAddr);
//连接服务器
retVal= connect(s,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR== retVal)
{
//失败处理
}
相关文章推荐
- 精通Windows Sockets 网络开发-基于Visual C++实现
- [精通WindowsSocket网络开发-基于VC++实现]第四章——阻塞模式开发
- [精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—TCP,UDP程序 .
- 端口数据[精通WindowsSocket网络开发-基于VC++实现]第二章——TCP/IP简介
- [精通WindowsSocket网络开发-基于VC++实现]第一章——准备开发环境
- [精通WindowsSocket网络开发-基于VC++实现]第二章——TCP/IP简介
- [精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—概念
- [精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—TCP,UDP程序
- [精通WindowsSocket网络开发-基于VC++实现]第四章——阻塞模式开发
- [精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—TCP,UDP程序
- 数据字[精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—概念
- [精通WindowsSocket网络开发-基于VC++实现]第五章——非阻塞模式开发
- [精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—TCP,UDP程序
- [精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—TCP,UDP程序
- [精通WindowsSocket网络开发-基于VC++实现]第三章——WindowsSockets基础—概念
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 好东西和大家分享 《精通windows sockets网络编程--基于Visual C++实现》随书源码
- 基于visual c++之windows核心编程代码分析(47)实现交换网络的QQ号嗅探
- ijkplayer简单实现播放 ijkplayer是Bilibili基于ffmpeg开发并开源的轻量级视频播放器,支持播放本地网络视频,也支持流媒体播放。支持