您的位置:首页 > 理论基础 > 计算机网络

精通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)

       {

              //失败处理

       }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐