首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

怎么通过winsock控制路由器自动重启

2012-01-23 
如何通过winsock控制路由器自动重启请教各位,如何通过winsock控制路由器自动重启?[解决办法]路由器其实就

如何通过winsock控制路由器自动重启
请教各位,如何通过winsock控制路由器自动重启?

[解决办法]
路由器其实就是一台计算机,有操作系统,有命令和接口

如果要对路有器操作,重要的不是如何编程,而是熟悉此路由器,同时拥有权限!
[解决办法]
有些路由器可以通过SNMP协议接口重新启动。不过要看你用的路由器的具体情况了,很难一概而论。
[解决办法]
下面是用到winsock的代码,我也是从网上找的,自己做了一些修改:

C/C++ code
#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define WINSOCK_VERSION        MAKEWORD(2,2)        // winsock版本//-----------------------------------------// Name: TCP_Req()// Desc: 向指定端口的指定地址发送TCP数据包//       返回时,输入数据的缓冲区存放接收的数据,输入数据的长度的变量存放接收的数据的长度//       因为传输的不一定是文本,所以数据结尾没有空字符//-----------------------------------------int TCP_Req(char const * const host_name, WORD const host_port,            char * const buffer, int const buffer_size, int &data_len)    {    assert(host_name && *host_name);    assert(buffer && *buffer);    // 缓冲区大小不小于其中的数据长度    assert(buffer_size > 0  &&  data_len > 0  &&  buffer_size >= data_len);    // 初始化Winsock    WSADATA wsadata;    if(WSAStartup(WINSOCK_VERSION, &wsadata))        return -1;        // 初始化Winsock出错    // 得到主机信息    LPHOSTENT lphostent = gethostbyname(host_name);    if(lphostent == NULL)        {        WSACleanup();        return -2;        // 无法得到主机信息        }    // 填写连接地址信息    SOCKADDR_IN saServer;    saServer.sin_family = AF_INET;    saServer.sin_port = htons(host_port);    saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list);    // 创建Socket,向主机发出连接请求    SOCKET hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    int nRet = connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));    if (nRet == SOCKET_ERROR)        {        closesocket(hsocket);        WSACleanup();        return -3;            // 无法连接到主机        }    // 发送数据包    nRet = send(hsocket, buffer, data_len, 0);    if (nRet == SOCKET_ERROR)        {        closesocket(hsocket);        WSACleanup();        return -4;            // 发送数据包出错        }    // 接收数据,直到无数据传入    char *p_buffer = buffer;    int len = buffer_size;    data_len = 0;    nRet = 1;    while(nRet > 0)        {        nRet = recv(hsocket, p_buffer, len, 0);        // 收到数据后,把缓冲空间指针移到收到的数据后,并减少剩余空间大小,为下一次接收做准备        if (nRet > 0)            {            p_buffer += nRet;            len -= nRet;            // 如果某次接收后缓冲空间刚好用光(不会出现空间不够还正常返回的情况(len<0)),则跳出            // 如果这里不处理,recv()收到为0的长度后可能会返回错误(for byte stream sockets only)            if (len == 0)                {                data_len = buffer_size;                break;                }            }        // 数据接收完毕        else if (nRet == 0)            {            data_len = (int)(p_buffer - buffer);            break;            }        // 接收数据时发生错误        else            {            nRet = WSAGetLastError();            // 如果数据过长,缓冲空间放不下,则能放多少就放多少,不返回错误            if (nRet == WSAEMSGSIZE)                {                data_len = buffer_size;                break;                }            // 如果是其他错误,则返回出错            else                {                closesocket(hsocket);                WSACleanup();                return -5;        // recv()其他错误                }            }        } // end while    closesocket(hsocket);    WSACleanup();    return 0;    } // end TCP_Req 

热点排行