69,369
社区成员
发帖
与我相关
我的任务
分享
//查询结果
char *string = NULL;
SnmpMgrOidToStr(&variableBindings.list[0].name, &string);
printf("Variable = %s\n", string);
//发送查询结果
ret = send (sClient, (char *)&string, sizeof(string), 0);
if (string) SNMP_free(string);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
//转换成字符串
char str[255];
sprintf(str, "%s",&variableBindings.list[0].value);
//发送
ret = send (sClient, (char *)&str, sizeof(str), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
printf("\n");
struct student{
int num;
char name[N];
int age;
};
struct student st;
/*.......*/结构体初始化
char buf[N];
sprintf(buf, "%d%s%d", st.num, st.name, st.age);//会自动追加结束符
大小端问题可以用函数htonl()进行转换,不是结构体转字符串的问题,是网络字节序的问题~
//2个字节类型的转换
#define BSWAP_16(x) \
(UINT16) ( ((((UINT16)(x)) & 0x00ff) << 8 ) | \
((((UINT16)(x)) & 0xff00) >> 8 ) \
)
//四个字节类型的转
#define BSWAP_32(x) \
(UINT32) ( (( ((UINT32)(x)) & 0xff000000 ) >> 24) | \
(( ((UINT32)(x)) & 0x00ff0000 ) >> 8 ) | \
(( ((UINT32)(x)) & 0x0000ff00 ) << 8 ) | \
(( ((UINT32)(x)) & 0x000000ff ) << 24) \
)
// d2.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "d2.h"
#include <stdlib.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //ÕìÌý¶Ë¿Ú
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <snmp.h>
#include <mgmtapi.h>
#pragma comment(lib,"Mgmtapi.lib")
#pragma comment(lib,"Snmpapi.lib")
#define GET 1
#define GETNEXT 2
#define WALK 3
#define TRAP 4
#define TIMEOUT 6000 /* milliseconds */
#define RETRIES 3
extern "C" __declspec(dllexport) int main()
{
char a[100]; //=".1.3.6.1.2.1.1"
char b[100]; //´æ·ÅIPµØÖ·
char *SnmpOid;
int operation;
RFC1157VarBindList variableBindings;
LPSNMP_MGR_SESSION session;
int timeout = TIMEOUT;
int retries = RETRIES;
BYTE requestType;
AsnInteger errorStatus;
AsnInteger errorIndex;
char *chkPtr = NULL;//»¹Ã»¸ãÃ÷°×ÕâÊǸÉÂïµÄ
operation = WALK;
//socket µÄ¶¨Òå
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient; //Á¬½ÓÌ×½Ó×Ö
struct sockaddr_in saServer; //µØÖ·ÐÅÏ¢
BOOL fSuccess = TRUE;
//WinSock³õʼ»¯
wVersionRequested = MAKEWORD(2, 2); //Ï£ÍûʹÓõÄWinSock DLLµÄ°æ±¾
ret = WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return 1;
}
//È·ÈÏWinSock DLLÖ§³Ö°æ±¾2.2
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("Invalid WinSock version!\n");
return 1;
}
//´´½¨Socket,ʹÓÃTCPÐÒé
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed!\n");
return 1;
}
printf("input the ip address:");
scanf("%s",&b);//ÊäÈëIPµØÖ·
printf("input the oid:");
scanf("%s",&a);
printf("%s",a);
SnmpOid=&*a;
//¹¹½¨·þÎñÆ÷µØÖ·ÐÅÏ¢
saServer.sin_family = AF_INET; //µØÖ·¼Ò×å
saServer.sin_port = htons(SERVER_PORT); //×¢Òâת»¯ÎªÍøÂç½ÚÐò
saServer.sin_addr.S_un.S_addr = inet_addr(b);//·þÎñÆ÷µØÖ·
//Á¬½Ó·þÎñÆ÷
ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("connect() failed!\n");
closesocket(sClient); //¹Ø±ÕÌ×½Ó×Ö
WSACleanup();
return 1;
}
{
AsnObjectIdentifier reqObject;
variableBindings.list = NULL;
variableBindings.len = 0;
//°Ñ×Ö·û´®×ª»»³É±ê×¼OID
if (!SnmpMgrStrToOid(SnmpOid, &reqObject))
{
printf("Error: Invalid oid.\n");
return 1;
}
else
{
printf("oid is ok.\n");
variableBindings.len++;
if ((variableBindings.list = (RFC1157VarBind *)SNMP_realloc(
variableBindings.list, sizeof(RFC1157VarBind) *
variableBindings.len)) == NULL)
{
printf("Error: Error allocating oid.\n");
return 1;
}
printf("allocate oid is ok.\n");
variableBindings.list[variableBindings.len - 1].name=reqObject;
variableBindings.list[variableBindings.len - 1].value.asnType=ASN_NULL;
}
if (operation == WALK && variableBindings.len != 1)
{
printf("Error: Multiple oids specified for WALK.\n");
return 1;
}
if ((session = SnmpMgrOpen("127.0.0.1", "public", timeout, retries)) == NULL)
{
printf("error on SnmpMgrOpen.\n");
return 1;
}
else printf("session is ok.\n");
}
{
AsnObjectIdentifier root;
AsnObjectIdentifier tempOid;
SnmpUtilOidCpy(&root, &variableBindings.list[0].name);
requestType = ASN_RFC1157_GETNEXTREQUEST;
printf("start snmpmgr.\n");
while(1)
{
if (!SnmpMgrRequest(session, requestType, &variableBindings,
&errorStatus, &errorIndex))
{
printf("error on SnmpMgrRequest %d.\n Error: errorStatus=%d, errorIndex=%d \n",GetLastError(),errorStatus, errorIndex);
break;
}
else
{
printf("request is ok.\n");
if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME ||
SnmpUtilOidNCmp(&variableBindings.list[0].name,
&root, root.idLength))
{
printf("End of MIB subtree.\n\n");
break;
}
if (errorStatus > 0)
{
printf("Error: errorStatus=%d, errorIndex=%d \n", errorStatus, errorIndex);
break;
}
else
{
// ·¢²éѯ½á¹û
char *string = NULL;
SnmpMgrOidToStr(&variableBindings.list[0].name, &string);
printf("Variable = %s\n", string);
//·¢ËÍ
ret = send (sClient, (char *)&string, sizeof(string), 0);
if (string) SNMP_free(string);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
//ת»»³É×Ö·û´®
char str[255];
sprintf(str, "%s",&variableBindings.list[0].value);
//·¢ËÍ
ret = send (sClient, (char *)&str, sizeof(str), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
printf("\n");
}
} // end if()
// ×¼±¸ÏÂÒ»´Î²éѯ
SnmpUtilOidCpy(&tempOid, &variableBindings.list[0].name);
SnmpUtilVarBindFree(&variableBindings.list[0]);
SnmpUtilOidCpy(&variableBindings.list[0].name, &tempOid);
variableBindings.list[0].value.asnType = ASN_NULL;
SnmpUtilOidFree(&tempOid);
} // end while()
// ÊÍ·Å×ÊÔ´
SnmpUtilVarBindListFree(&variableBindings);
SnmpUtilOidFree(&root);
}
closesocket(sClient); //¹Ø±ÕÌ×½Ó×Ö
WSACleanup();
// ¹Ø±Õ SNMP session
if (!SnmpMgrClose(session))
{
printf("error on SnmpMgrClose %d\n");
return 1;
}
return 0;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// This is an example of an exported variable
D2_API int nD2=0;
// This is an example of an exported function.
D2_API int fnD2(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see d2.h for the class definition
CD2::CD2()
{
return;
}