如何通过winsock控制路由器自动重启
请教各位,如何通过winsock控制路由器自动重启?
[解决办法]
路由器其实就是一台计算机,有操作系统,有命令和接口
如果要对路有器操作,重要的不是如何编程,而是熟悉此路由器,同时拥有权限!
[解决办法]
有些路由器可以通过SNMP协议接口重新启动。不过要看你用的路由器的具体情况了,很难一概而论。
[解决办法]
下面是用到winsock的代码,我也是从网上找的,自己做了一些修改:
#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