找回密码
 注册
搜索
查看: 3999|回复: 0

使用WinInet编写发送短信程序

[复制链接]
发表于 2003-10-2 22:31:13 | 显示全部楼层 |阅读模式
  如果能够使自己程序具有短信发送功能,那将会使您的程序蓬荜生辉,特别是通讯录等程序。通常在程序中发送短信有两种方式,一种是使用GSM Modem通过计算机串口编程发送短信,这种方式需要购置硬件设备,既不方便又不经济!另一种方式是通过网络发送,我们可以先在163.com等网站上注册一个用户,然后通过这些具有短信发送功能的网站发送短信。这种方式比较经济。下面本文讲述第二种的实现方式。
8 B1 S2 R. B- [  {   
! p5 `/ ]& A, c+ A7 w/ w; a  B   实际上,我们的程序只要具有象浏览器那样向HTTP服务器发送数据的功能,我们就可以模拟浏览器的登陆等操作,通过程序来发送短信。我们打算使用WinInet函数来实现与HTTP服务器的通信。
" Z( q; T# H% e$ e& r7 n* `7 G+ _0 Y! N7 D# L
   主要就两个函数,一个就是模拟浏览器的函数,另一个是发送短信的函数,其中使用了网易作为测试样例,您还可以自己添加其他短信网关。+ K7 A" C, Z9 N
% U4 n- G2 z, G0 G7 [% a
/*****************************************************************# O7 _( j! ]" o  S/ }" W
* 函数介绍: 执行HTTP的Post或Get方法
1 H3 p% z3 |9 l$ ?% |  r& O4 l, ]* 输入参数: TCHAR* hdrs       - HTTP头# t- Z! T: X9 w- w% N1 v
            TCHAR* accept     - Accept类型
2 e. Q# v4 w8 e: v            TCHAR* Method     - POST 或 GET
( V/ C' v5 F3 E+ G+ {            TCHAR* frmdata    - 要提交的数据
8 @! c4 R; O( g            TCHAR* ServerName - 服务器地址
# ^% @; j$ x  \            TCHAR* FormAction - 数据提交到的网页名称5 R' B( ]% p8 [2 a8 }: w/ D* m
* 输出参数: 无
$ ^9 s( Q' H, j& o- o* 返 回 值: int               - 返回操作状态(见SendSMS)
) L: I3 i! I/ z8 p" e% u& v$ q0 ~9 ]*****************************************************************/8 x- |$ q- i4 l4 `& R- R0 F- c, E
int doHTTP(TCHAR* hdrs, TCHAR* accept, TCHAR* Method, TCHAR* frmdata, TCHAR* ServerName, TCHAR* FormAction)$ \; U2 t) t: A( S# Y: ]! D
{
2 K- |; ]; Q4 k& b   // 创建Internet
$ u/ j6 k$ @2 [' a( H" J   HINTERNET hSession = InternetOpen("MyAgent",
) t& j# D4 _2 w! u+ N                                     INTERNET_OPEN_TYPE_PRECONFIG, # y3 A* M/ E5 b' D1 i& o
                                     NULL, - D, t$ r( K& J! r% W" T5 T
                                     NULL,& J% h0 ]6 a$ T5 |' `: |# m% _
                                     0);. B9 d/ K. F0 d5 U) Q  y  c1 y
   if (!hSession)
' C. k) F+ }% d9 t1 k   {' y- N8 S/ D* ]% D
       return 5;
9 @! f4 s7 s" E/ }! x   }
6 u4 F" _4 P9 k2 ]& `/ I9 n   // 连接服务器
+ ?- ~2 V4 D' W$ ]8 q4 e   HINTERNET hConnect = InternetConnect(hSession,
/ ?+ N" Z7 y! ~! D# d; `. v                                        ServerName,
) C4 h3 B1 h! F; f                                        INTERNET_DEFAULT_HTTP_PORT, : P) u- P( A8 x
                                        NULL,
# x& T" q) _! c: ~' }/ O% J                                        NULL,
6 y: H' i. k+ J1 o                                        INTERNET_SERVICE_HTTP, 0 Q7 F. o  ^$ F$ N
                                        0, 1 n: n8 ~- }: x; H( g- k& }
                                        1);3 h' j4 a+ D2 V  u5 |) F
   if (!hConnect)
: ]2 d/ o& J4 V" ^' Z9 m" i4 k7 D: e1 S   {" v7 d, V! X# U# `: ?
       return 2;- p9 s/ G: X! i- R5 F
   }
+ g6 J4 V+ @2 J* m, Y- p   // 创建一个请求. v2 c/ V3 @) @! X
   HINTERNET hRequest = HttpOpenRequest(hConnect,
3 e) v4 N" G; ?$ f# M! H1 A4 O                                        Method,: d6 U( Z, a  ?& X- G, S) z- @
                                        FormAction,9 E: @* s" Q) `  |
                                        HTTP_VERSION,
1 X6 N8 \( W* R2 t. ]  W& H                                        NULL, / U' e5 c+ ^" J% b+ f% A' U
                                        (const char**)&accept,) e3 z2 [6 a, ^
                                        0, ) _" e% B, a% a8 a: P$ m
                                        1);! h) g! e- c) q
   if (!hRequest)- y: k. _$ K# O  x  S. b1 \
   {0 o/ K( q9 O* T2 `, [
       return 2;
" H2 e: c( B) f" r$ k, C3 K   }
. U* S  D) M2 U   // 发送请求
* {/ E8 m1 s9 z1 ]- W   BOOL bSendRequest = HttpSendRequest(hRequest,: y4 b. p/ a8 y* p; P, W
                                       hdrs,
; U/ N9 z6 Q+ A% J) j% \                                       strlen(hdrs),5 I- `6 \- X! [0 d& ?+ ?9 J  S
                                       frmdata,) K- C. F/ x3 {' b
                                       strlen(frmdata));" D3 w! P/ A4 l1 Q- f% F) S% e
   if (!bSendRequest)& H" s* e+ X: X- y/ w7 G( L
   {
4 t0 _$ m0 y- k. C( B       return 2;
9 |: n. e$ b, S& o, s4 J6 ~6 Z   }
& B# _* ], S4 l$ p% O; f! r! I3 I( {& m
////////////////////////调试用/////////////////3 c) S/ `" R9 }( t2 O" j! }
#ifdef _DEBUG8 z# }$ }8 J) i; Z* H+ t' Q
   int bDoLoop = 1;# Q$ i# S8 a( q+ `6 S( ?. J
   LPTSTR szReadBuffer;( s+ l* ?; ]) E% l% u: L; b  |" r& w$ L
   DWORD lNumberOfBytesRead;& v! r( H" F1 v" Y  L& ^" P3 Y7 h
   FILE* f1;
# S$ {2 V6 n( h   szReadBuffer = (LPTSTR) malloc(500);
& k7 ]6 Z, J2 {9 O( l' o   ZeroMemory(szReadBuffer, 500);
0 M- j7 P* _6 X& }   if ((f1=fopen("c:\\test.htm", "w"))!=NULL)
% W; N( w# v) J; n6 B   {
6 r2 ~1 B- O+ ~' y       while(bDoLoop)$ w( ]3 K! S, U2 d: v
       {; i9 }+ g/ F: M* D1 X7 S( e
           bDoLoop = InternetReadFile(hRequest, szReadBuffer, 500, &lNumberOfBytesRead);$ H  _7 P9 ^! ?0 u2 v
           fseek(f1, 0L, SEEK_END);' l* A' x  i3 S( G0 K/ ^
           fwrite(szReadBuffer, sizeof(szReadBuffer), lNumberOfBytesRead, f1); 8 K# N$ [9 i4 U
           if (lNumberOfBytesRead<500)7 ~* b% W4 d3 o* e9 p% d
               bDoLoop = 0;
1 o1 b  C. i5 p       }3 t% x+ c, t  s: x, I1 @
   }% u# t% c2 z' K8 u/ ~+ b
   fclose(f1);
7 g! u$ o& {2 Y  \. Q% W- V: A   free(szReadBuffer);
6 F; @% B, P. L% G. x9 X( K#endif
" c  c. f" I9 Q//////////////////////////////////////////////////
! [& d9 q& B3 [  \
6 a- p: `. {' h+ [- C   // 清除句柄
) C1 i" ^: g% F/ ~   if (hRequest)+ n  l- f+ U7 E
       InternetCloseHandle(hRequest);
; \9 k1 E* [+ P; c7 ?1 H! C   if (hConnect)2 g. U$ h* T& e7 X9 k6 L
       InternetCloseHandle(hConnect);& q( P! _% p9 l2 Y$ g! x, U0 U: J
   if (hSession)* {) D  [- A0 n' p
       InternetCloseHandle(hSession);
. N, s$ p" O5 `5 N/ q& R/ o) m
( b$ j8 V3 ^0 ~/ f   return 0;+ R, H3 _4 r' v5 n( W5 g! ?
}
0 N6 T1 W3 J, ?( z0 l; a% _) v: ]. D: s
/*****************************************************************
; g! v3 h2 s# f8 k* 函数介绍: 发送短信函数' K- Q% M& ^2 i2 o) X7 E
* 输入参数: char* lpGateway  - 发送网关名称6 H# I+ A) C8 f
            char* lpUserName - 发送者登陆账号
. u& f7 i" ?; k* a            char* lpPassword - 发送者登陆密码
4 ^, B% f  z5 L  M2 l            char* lpPhone    - 接收者手机号码
8 n/ O/ I! o4 e: h  r) |2 U            char* lpContent  - 发送内容$ y  a/ h8 [4 J( q
            char* lpNickName - 发送者昵称) Q9 n4 B" [6 I: s# M
            char* lpExtent   - 扩展信息                                        l) f" p/ @8 D5 ^8 `5 C, Z% y
* 输出参数: 无( V  C  }+ U/ ~! o1 \2 l
* 返 回 值: int       00     - 操作完成,结果未知
5 J, t3 r0 W' q8 e                      01     - 网关代号不存在& W, M& X/ _# a1 S! g6 `
                      02     - 网络连接超时* h. S0 \7 c  `  y8 J4 n
                      03     - 用户中止操作/ e5 g: {* r9 I* T
                      04     - 网关/账号/手机/短信内容空白或非法
' V/ N# e+ T+ s( d4 n5 |& i6 ?# L/ g                      05     - 出现其他错误. Q# p: q, C9 R8 M3 d
*****************************************************************/) h5 x3 g8 O+ [+ H4 v- U. S* _, w
SENDSMS_API int CALLAGREEMENT SendSMS(char* lpGateway,
) `' l1 C  ?7 Y9 ^9 J                                        char* lpUserName, $ R6 L" x4 N/ F$ W" I7 J
                                      char* lpPassword,, r3 T7 {* I( |2 V2 V7 Y
                                      char* lpPhone,   $ g% H# J9 C* j8 L" `
                                      char* lpContent,  [' {# g6 L% w, R
                                      char* lpNickName,+ _, D4 T3 [) c% w4 i6 j
                                      char* lpExtent8 j$ K$ G  ]" T" h& {3 z
                                      )! Z, l( o* S/ ?% r9 w* `' a
{3 n; V( Z$ O7 i  O) N& l: N# F
    int Result;
' o4 `2 i( G- H" [2 B/ c    static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
) m( |0 m$ M% \; V% X+ Z; G2 d    static TCHAR accept[] = _T("Accept: */*");
; D% d1 e) N: M. k; T    static TCHAR frmdata[1024];
2 e; C. m+ z5 R# l2 U$ e- W- C. {- o, P  ?; Z
    // 登陆姓名,密码等不允许为空
& @: x9 F- H$ U- A; L    if ((strlen(lpGateway)<=0)||(strlen(lpUserName)<=0)||$ i0 i7 w8 \: r
          (strlen(lpPassword)<=0)||(strlen(lpPhone)<=0)||(strlen(lpContent)<=0))  Z4 r  c/ k3 `- l3 t1 H  \2 p
        return 4;
) d2 w1 I8 Q  F' h+ k* ^- l9 p/ F4 t; E  I
    // 选择网易网关发送
- m! P5 T5 @$ s9 f- A4 h    if (strcmp(lpGateway, "163.com")==0)
, s* H( a- ]" L% r( z    {. u" F$ e6 }# {% E# _/ P9 f
        // 登录短信发送系统
( F5 l' L+ ?2 t# k. S) d* ~        sprintf(frmdata, "username=%s&password=%s", lpUserName, lpPassword);
. o- i4 i# x& d        Result = doHTTP(hdrs, accept, "OST", frmdata, "reg4.163.com", "/in.jsp");
1 ?2 Y! z6 R8 z* j3 s9 w! c' O; J        " S) T# J  W* E* O5 x4 y; l
        // 发送短信( y- y$ U  Z: X# e. e
        if (strlen(lpNickName)>0)
2 o; s) s8 ^; e0 J/ {            sprintf(frmdata, "send=1&phone=%s&message=%s--%s", lpPhone, lpContent, lpNickName);
* M9 L* |0 Q( d' d) D        else
  l% ]' s6 |6 w) g+ H            sprintf(frmdata, "send=1&phone=%s&message=%s", lpPhone, lpContent);
6 ^/ y9 w0 I% {7 V3 n        Result = doHTTP(hdrs, accept, "OST", frmdata, "sms.163.com", "/service/sendmsg_pop.php");
4 b( F% ]/ \1 i9 s6 F        
$ Z) U' \1 z( t9 {/ M( [$ o! K        // 退出短信发送系统0 {* q  d- \( I) A  n
        sprintf(frmdata, "username=%s", lpUserName);
/ t" O3 ^1 }5 x' {: _        Result = doHTTP(hdrs, accept, "GET", frmdata, "reg4.163.com", "/Logout.jsp");/ E4 l+ }  B+ R8 M( \$ o
  e! H* m' @7 u# x
        return Result;3 V/ g; H9 J9 D( x9 T" H& ~
    }0 O6 O$ \& A6 Q% n- v

3 X0 v  R6 C1 Q: q8 L% g* ?" x+ y, ]. n1 t
    // 选择搜狐网关发送) G4 w1 j( x8 s. h
    if (strcmp(lpGateway, "sohu.com")==0); F! N# ~6 e/ E0 k; W, Y. R
    {1 _, L2 X6 [% Z/ o2 T5 q1 ^
        Result = 1;
0 t" `7 P+ b6 O5 g        return Result;
8 R% r9 H9 J0 \9 g' r" o# Y/ n( P    }
  @: w$ b9 Y, V9 V2 U0 L9 k5 S0 c4 E0 l/ W& ~& X7 r. v
    // 网关代号不存在8 |& R( D- b, l% b! ^7 Z; w. P* [
    return 1;% Q0 p8 X5 }; u7 @/ i" D+ S# m
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-6-18 11:26 , Processed in 0.017661 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表