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

使用WinInet编写发送短信程序

[复制链接]
发表于 2003-10-2 22:31:13 | 显示全部楼层 |阅读模式
  如果能够使自己程序具有短信发送功能,那将会使您的程序蓬荜生辉,特别是通讯录等程序。通常在程序中发送短信有两种方式,一种是使用GSM Modem通过计算机串口编程发送短信,这种方式需要购置硬件设备,既不方便又不经济!另一种方式是通过网络发送,我们可以先在163.com等网站上注册一个用户,然后通过这些具有短信发送功能的网站发送短信。这种方式比较经济。下面本文讲述第二种的实现方式。0 d% g2 `. a9 R5 r1 p0 c+ J
   
! x( X+ D% R( m   实际上,我们的程序只要具有象浏览器那样向HTTP服务器发送数据的功能,我们就可以模拟浏览器的登陆等操作,通过程序来发送短信。我们打算使用WinInet函数来实现与HTTP服务器的通信。$ M  n. F2 N# X6 @

- {" c2 x) ?2 U! e5 o1 \6 t( ~9 f   主要就两个函数,一个就是模拟浏览器的函数,另一个是发送短信的函数,其中使用了网易作为测试样例,您还可以自己添加其他短信网关。
6 Q) x( {2 b$ p( U; r
0 n; O1 c  K+ a7 j6 @, U0 `/*****************************************************************
/ b) y: W0 z1 v& V. G- k" R- M* 函数介绍: 执行HTTP的Post或Get方法
* U* A" `6 i; Z/ B3 P7 g, u$ j& s3 X* 输入参数: TCHAR* hdrs       - HTTP头
+ x# \* A* d1 j) t& ^- T            TCHAR* accept     - Accept类型0 M. ?, _$ V1 b1 u& A
            TCHAR* Method     - POST 或 GET
. v7 `5 k8 _2 V7 i            TCHAR* frmdata    - 要提交的数据
& Y. z/ E- o% W8 u1 c9 W. H            TCHAR* ServerName - 服务器地址0 i8 O8 T) U$ y: F$ M- w' T) [4 S" j
            TCHAR* FormAction - 数据提交到的网页名称. n: n% s) Z9 m5 C& F9 _7 F
* 输出参数: 无
' w+ y7 G8 f- @' K8 |" \* 返 回 值: int               - 返回操作状态(见SendSMS)
# C& Z) z& O' _! P! ?*****************************************************************/0 l0 e3 Y5 S( C5 `6 D
int doHTTP(TCHAR* hdrs, TCHAR* accept, TCHAR* Method, TCHAR* frmdata, TCHAR* ServerName, TCHAR* FormAction); X, |" W/ Q" Y
{% n+ m$ M) `" O2 G- O$ h7 m% \
   // 创建Internet
5 t- J4 D. R. D1 t! i1 F4 ?   HINTERNET hSession = InternetOpen("MyAgent",
- I6 \- G9 o! |$ ?                                     INTERNET_OPEN_TYPE_PRECONFIG, 2 d% C' o. H! i9 ~# y. n3 ]* N
                                     NULL,
7 s8 b3 z  \3 w4 X1 ^                                     NULL,
% ?7 v3 p- a. u  ~                                     0);
6 L- t6 x. n" j8 l7 M   if (!hSession)
# _2 q" y& C0 X   {
% E" Q+ F: \7 }8 x2 t) e! a/ e) h       return 5;
; v% @9 W& u3 X% h3 S   }
' p+ u) X2 R+ n. y$ i) H3 B" v+ P   // 连接服务器6 _) l4 Y! W  O
   HINTERNET hConnect = InternetConnect(hSession, * e; b' s2 r) F& I: I# G
                                        ServerName,
( ?! p( P* C+ L( V                                        INTERNET_DEFAULT_HTTP_PORT,
# M/ S, G1 o% U9 Z) H8 R                                        NULL, / |$ B& F6 @# d( n
                                        NULL, . ^' C" \, E! l! E+ C; Z4 |( B/ O
                                        INTERNET_SERVICE_HTTP,
9 I. ^- z* V, C$ O                                        0, ' k7 y) l' k$ T
                                        1);) b: O- ~- u, t
   if (!hConnect)& e3 r* `, [/ G& v8 Z/ U
   {
; o) l# X7 k' M- s# \, a$ f% v       return 2;
( G' ~1 p0 t9 W- y3 E# ]   }
$ F5 R$ R3 v$ U$ K! y   // 创建一个请求" H$ A: w" l. c( D
   HINTERNET hRequest = HttpOpenRequest(hConnect,/ [$ I$ f/ ]$ F& r
                                        Method,# `" U5 h2 @" Q2 q4 D. D
                                        FormAction,
$ L9 O* }  Y4 W                                        HTTP_VERSION,
0 w( J  y4 ~5 h                                        NULL,
) V- A5 @+ Q  J" }6 f                                        (const char**)&accept,, A1 M! }& `5 S1 t, l
                                        0, 7 J5 q# g# ]+ S- \
                                        1);
0 j( ?/ L2 Q& u' l& T   if (!hRequest)& [" L) C4 |! h3 b# F" v. g
   {
- V+ \. Y: |  i% d9 D' [8 y3 D$ H: B       return 2;/ N. t3 d; u" f0 o! A
   }
$ R  U8 `, g9 `# T# J7 g   // 发送请求( m7 a5 K! I9 C$ I% F6 _, _! @% T
   BOOL bSendRequest = HttpSendRequest(hRequest,
- Z7 C9 G. a3 `0 n6 [' p" {7 W                                       hdrs,
, u4 N( [: c6 ~1 q2 d                                       strlen(hdrs),
- J* ~0 Z; ?0 ?+ `7 u                                       frmdata,) h. N9 I2 Z  q1 K, c; p7 G
                                       strlen(frmdata));
* P+ B& @; x! W   if (!bSendRequest)1 g" t, Z- s) X) D4 j
   {& c' _7 _. u$ M% E
       return 2;
. \# ?& O, [6 W. S* E; C   }
7 e1 z9 J6 s  P- R( R0 I
) c* O8 G" T! {  P2 D$ B' }1 ^////////////////////////调试用/////////////////- @. o% [  h) G( D: I. H' ~
#ifdef _DEBUG
: _, c9 m5 a& X$ T1 v: V# q% @   int bDoLoop = 1;3 v. h0 }( u9 f! j
   LPTSTR szReadBuffer;' ?" p6 d7 C0 }2 O, a3 x
   DWORD lNumberOfBytesRead;9 b% v, V+ `8 Z" y
   FILE* f1;3 {) b7 V* _" _1 x7 g8 F
   szReadBuffer = (LPTSTR) malloc(500);
7 C$ p) }" W1 l8 L0 _& O   ZeroMemory(szReadBuffer, 500);
6 @9 ]7 Q! I' B   if ((f1=fopen("c:\\test.htm", "w"))!=NULL)
2 H. t6 h) q' n2 G8 y9 b   {
, g8 N8 q; i& ^1 Q( \       while(bDoLoop)
8 v. o, i4 l! U' E7 l# o* A       {
; _# D2 S; {( E           bDoLoop = InternetReadFile(hRequest, szReadBuffer, 500, &lNumberOfBytesRead);! S0 F' q/ V' @7 p5 m
           fseek(f1, 0L, SEEK_END);5 P3 @  E& q! D
           fwrite(szReadBuffer, sizeof(szReadBuffer), lNumberOfBytesRead, f1);
% m' \1 q% {. c( [           if (lNumberOfBytesRead<500)
7 c  `- o/ P5 h8 W! g% Y4 I' E& ?               bDoLoop = 0;
' e( v0 D2 b* H, F9 q0 e       }
! D4 R8 M5 a4 S4 K% Z! b4 e5 N2 W# y: |   }. e) r& _8 A. z/ \/ O) i  p
   fclose(f1);8 z0 u2 c) h* |1 d
   free(szReadBuffer);
# _4 m- t# z4 z; }. m" J3 B#endif0 [; A! p, i7 G. c9 S& X
//////////////////////////////////////////////////* p3 _1 `' O( i2 ]

- s' v/ @# b# V0 J9 P; p4 q2 w   // 清除句柄, O/ N  V* m! g) G8 ?9 ~' v7 y. ]* u
   if (hRequest)6 h& ]! i& q& H8 O4 c! l
       InternetCloseHandle(hRequest);
5 Y4 b, K9 K: W# L1 o; R# C. p+ E   if (hConnect)2 v% z; Q# i0 E
       InternetCloseHandle(hConnect);3 O3 \0 C' G2 s: q, k/ |4 Q  p) Z
   if (hSession): }+ z6 I4 k' k6 O& y3 R
       InternetCloseHandle(hSession);
4 N: {, u5 r$ ?) v* o" o' @
/ w5 {+ L! X# ~+ g   return 0;' [5 s, \' d0 F' }, i5 O8 ]) s9 i
}* s8 k: J3 ^- B* u
' W" y. C4 q; {( _
/*****************************************************************
! K! D3 |! K9 D, K0 w* 函数介绍: 发送短信函数2 V2 M! j; |5 M
* 输入参数: char* lpGateway  - 发送网关名称/ T, Z* C! k" q9 H( {, u" ^
            char* lpUserName - 发送者登陆账号
$ a8 e/ i& L3 S3 I# N0 ]            char* lpPassword - 发送者登陆密码; ~# R( G1 l' `* U& v$ Y
            char* lpPhone    - 接收者手机号码6 u8 D2 q& X' [* z# r
            char* lpContent  - 发送内容  n1 S+ P' R" e8 R4 m6 o
            char* lpNickName - 发送者昵称
4 l8 Z! y" v( y8 g; M0 N            char* lpExtent   - 扩展信息                                      
0 n% X( x' C1 i3 C- h  R5 X2 T7 D* 输出参数: 无
& J* j/ @5 m" q8 d, o0 F* 返 回 值: int       00     - 操作完成,结果未知
+ H" I3 E& C9 |9 |: h# H                      01     - 网关代号不存在
& [' F2 U# Z6 P$ s# k/ Q$ h                      02     - 网络连接超时
" [5 g  n9 e' V6 B! G" X1 }                      03     - 用户中止操作+ R0 r) M" ]0 s1 d/ y
                      04     - 网关/账号/手机/短信内容空白或非法
! j" H5 v# h& |; N                      05     - 出现其他错误
& i. X$ a  g' P( f8 M  {3 ~. y*****************************************************************/9 x; @( e6 r3 A; p" s
SENDSMS_API int CALLAGREEMENT SendSMS(char* lpGateway,
* F4 S* [2 V9 T5 `" U                                        char* lpUserName,
" G. ]# k3 R$ Y7 S9 }! n: Y                                      char* lpPassword,, E" m3 A, Z3 }' X% s3 ~. f7 R- X4 e
                                      char* lpPhone,   
3 T! P, M9 p" }3 j                                      char* lpContent,
- K/ Y, m4 f+ q( W9 Z# @( Q$ h                                      char* lpNickName,' r5 z" I9 m2 R5 r( `
                                      char* lpExtent
/ `9 ]# _1 t; N! S+ K1 M9 e                                      )2 T. A, y; C2 j7 V; x) C1 B# R, R
{: Z1 b; i! |, L8 g3 `/ Q: K
    int Result;4 P& }, J0 R' f: P
    static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");7 N. R# z' g- p" _& n5 G
    static TCHAR accept[] = _T("Accept: */*");
1 [0 ?$ v8 l& h2 o, A    static TCHAR frmdata[1024];4 \& U( n. F2 z
/ y  T6 G  h+ J1 u  ]
    // 登陆姓名,密码等不允许为空8 h8 u* Z7 c" x, X
    if ((strlen(lpGateway)<=0)||(strlen(lpUserName)<=0)||* U/ ~9 k; E# G6 c3 ~; h( o& u
          (strlen(lpPassword)<=0)||(strlen(lpPhone)<=0)||(strlen(lpContent)<=0))
& T$ \4 V+ p5 `) [% L  C; \4 L        return 4;  ?, c- Y7 X) U/ t: G$ D

# G4 u  j* |+ j3 f7 z. d, N    // 选择网易网关发送
- p* ^2 J; Q# q    if (strcmp(lpGateway, "163.com")==0)$ Z7 u7 w. _4 C$ r7 Y2 c
    {" ]# Z+ M( \$ {/ m* y" {# s
        // 登录短信发送系统
4 V! M& p. W  @2 G5 D        sprintf(frmdata, "username=%s&password=%s", lpUserName, lpPassword);
" m5 g& @6 Q! k( B6 [) Y        Result = doHTTP(hdrs, accept, "OST", frmdata, "reg4.163.com", "/in.jsp");
7 p& i+ z0 T* v0 M- Q8 I$ I! o6 C        & r; o% i* g  A$ F( ]
        // 发送短信, w3 t: G6 F6 \, i! x
        if (strlen(lpNickName)>0)
3 V, ?; R$ v% i; c, h6 `- j            sprintf(frmdata, "send=1&phone=%s&message=%s--%s", lpPhone, lpContent, lpNickName);
1 L. U4 P/ u( g4 E  b; [# @        else( j; q% H8 A( R7 F
            sprintf(frmdata, "send=1&phone=%s&message=%s", lpPhone, lpContent);$ q& c( W$ M. `+ l0 q
        Result = doHTTP(hdrs, accept, "OST", frmdata, "sms.163.com", "/service/sendmsg_pop.php");
! `) ]3 c+ D: @* v( L! w  @0 \' V( o        , D* e  W: T) n! ^
        // 退出短信发送系统" a/ I- |5 B. m' L! y. M& k
        sprintf(frmdata, "username=%s", lpUserName);
6 N1 h' L, M# G) V        Result = doHTTP(hdrs, accept, "GET", frmdata, "reg4.163.com", "/Logout.jsp");5 U6 }! `1 D+ R2 M$ W. a" p
9 n1 T6 w6 e$ h0 D
        return Result;
+ D; P% [  S+ W* l2 J9 x# p    }
/ {! N# z' D/ ?0 r
- v' t1 N% U9 T/ Q" h4 }! w: p6 |
  E/ {9 h4 \5 h/ z; t8 i! w7 _    // 选择搜狐网关发送
2 t2 S6 r9 C) P    if (strcmp(lpGateway, "sohu.com")==0)
8 E% w7 }- r& B+ M7 `, O    {: X) x: G3 Q+ [/ `- G& I8 @
        Result = 1;
! I8 m( p; o/ `* Y" ^3 D        return Result;+ T/ k$ d$ d/ |* ~4 a
    }( a& K& f# @8 H) {' ], C
) `6 a, I0 O- C) ^7 e9 ]& m% p7 Z
    // 网关代号不存在3 B, A7 u2 W( L& h/ \3 ~
    return 1;
5 h: s, e- s7 h) d}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:35 , Processed in 0.017275 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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