您的位置:首页 > 理论基础 > 计算机网络

[Symbian] 通过 Socket 连接 HTTP 服务器

2009-07-13 03:33 375 查看
有几个关键点:

目标工程文件(.mmp) 中必须增加这一行说明: CAPABILITY NetworkServices

通过CMWap连接的话,连接的服务器IP地址是 10.0.0.172,端口是 80

HTTP包中必须包含 Host(X-Online-Host) 字段(因为是通过10.0.0.172这个代理)

如果需要发送post数据,除了把GET改为POST之外,还必须包含 Content-Length字段,否则报体不会被转发;另外,根据HTTP协议,还需要加上Content-Type: application/x-www-form-urlencoded,以便服务器能正确获取POST数据。

以下的代码可能是最简单的形式(在N95,CMWap环境下测试通过)

/*
============================================================================
Name		: yysst.cpp
Author	  : Moky
Copyright   : Be Technology Inc.
Description : Static lib source file
============================================================================
*/
//  Include Files
#include <e32cons.h>
#include <eikenv.h>
#include "yysst.h"
#ifndef ALERT
#define ALERT(x) CEikonEnv::Static()->AlertWin(x);
#endif
HBufC8 *CmwapRequest(const TDesC8 &data);
TInt DoYysstBuz(const TDesC16 & aTag) {

TBuf8<10240> send;
send.Copy(_L("POST /test_report.php?tag3="));
send.Append(aTag);
send.Append(_L(" HTTP/1.1/r/n"));
send.Append(_L("Host: test.139.mobi/r/n"));
send.Append(_L("Content-Length: 7/r/n"));
send.Append(_L("Connection: close/r/n"));
send.Append(_L("/r/n"));
send.Append(_L("a=b&c=d"));

HBufC8 *recv = CmwapRequest(send);
return 0;
}
HBufC8 *CmwapRequest(const TDesC8 &data)
{
//RNif iNif;
RSocket iSocket;
TRequestStatus iStatus = KRequestPending;
TBuf8<512> writeBuf(data);
TBuf8<64> recvBuf;
HBufC8 *iBuffer = NULL;

//iNif.Open();
_LIT(KServerIP, "10.0.0.172");
TInt KServerPort = 80;
{
RSocketServ iSocketServ;
User::LeaveIfError(iSocketServ.Connect());
TInetAddr iAddress;
if (iAddress.Input(KServerIP) == KErrNone)
{
User::LeaveIfError(iSocket.Open(iSocketServ, KAfInet, KSockStream, KProtocolInetTcp));
iAddress.SetPort(KServerPort);

iStatus = KRequestPending;
iSocket.Connect(iAddress, iStatus);
User::WaitForRequest(iStatus);
if (iStatus.Int() == KErrNone)
{
iStatus = KRequestPending;
iSocket.Write(writeBuf,iStatus);
User::WaitForRequest(iStatus);
if (iStatus.Int() == KErrNone)
{
TSockXfrLength iDummyLength;
TInt recvSize = 0;

for(;;)
{
iStatus = KRequestPending;
iSocket.RecvOneOrMore(recvBuf, 0, iStatus, iDummyLength);
User::WaitForRequest(iStatus);

if (iStatus.Int()==KErrNone)
{
recvSize += recvBuf.Length();
if(iBuffer == NULL)
iBuffer = HBufC8::NewL(recvSize);
else
iBuffer = iBuffer->ReAlloc(recvSize);
iBuffer->Des().Append(recvBuf);
}
else
{
break;
}
}
}
}
iSocket.Close();
}

iSocketServ.Close();
}
//iNif.Close();
return iBuffer;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐