国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

使用C#進行SMTP協議客戶端開發心得--讀取服務器應答篇

2024-07-21 02:18:57
字體:
來源:轉載
供稿:網友

商業源碼熱門下載www.html.org.cn

以tcpclient連接方式為例,首先取得服務器發回的數據流。

networkstream streamaccount=tcpclient.getstream();

當我們對smtp服務器發送請求,例如連接,傳送用戶名,密碼后,服務器會返回應答數據流。

我們必須對服務器返回數據流進行讀取,這一步我經歷了3次改動。

最開始的程序是按照《visaul c#.net網絡核心編程》這本書上的例子來寫的:

private string readfromnetstream(ref networkstream netstream)
{
byte[] by=new byte[512];
netstream.read(by,0,by.length);
string read=system.text.encoding.ascii.getstring(by);
return read;
}

這種方式其實就是把讀到的數據流全部變成字符串形式,但是實際網絡傳輸中,smtp服務器發回的其實不一定全部是有效的命令,命令都是以<crlf>(回車加換行)結束的。因此這樣的讀取方式存在問題。

修改以后的代碼如下:

private string readfromnetstream(ref networkstream netstream,string strendflag)
{
string resultdata = "";
byte[] ubbuff=new byte[1024];
try
{
while(true)
{
int ncount = netstream.read(ubbuff,0,ubbuff.length);
if( ncount > 0 )
{
resultdata += encoding.ascii.getstring( ubbuff, 0, ncount);
}

if( resultdata.endswith(strendflag) )
{
break;
}

if( ncount == 0 )
{
throw new system.exception("timeout");
}
}
}
catch(system.exception se)
{
throw se;
messagebox.show(se.tostring());
return "";
}
return resultdata;
}

這樣一來,就可以截取出以回車換行結束的命令。但是這樣做還是不夠正確的,因為smtp服務器在某些情況下會發回一些歡迎信息之類的東西,它們也是以<crlf>(回車加換行)結束的,我們用上邊的程序得到的很有可能不是我們實際想要得到的正確命令。

于是我只有再次修改程序如下:

/**
*
* 讀取服務器的返回信息流
*
*/
public string readfromnetstream(ref networkstream netstream)
{

if( netstream == null )
return "";

string resultdata = "";
try
{
while(true)
{
string linedata = readlinestr(netstream);
if( null != linedata
&& linedata.length > 4)
{
if(linedata.substring(3,1).compareto(" ") != 0)
{
resultdata += linedata + "/r/n";
continue;
}
else
{
resultdata += linedata;
break;
}
}
else
{
resultdata += linedata;
break;
}
}
}
catch(exception e)
{
throw e;
}

return resultdata;
}

/**
*
* 逐行讀取服務器的返回信息
*
*/
public byte[] readline(networkstream m_strmsource)
{
arraylist linebuf = new arraylist();
byte prevbyte = 0;

int currbyteint = m_strmsource.readbyte();
while(currbyteint > -1)
{
linebuf.add((byte)currbyteint);

if((prevbyte == (byte)'/r' && (byte)currbyteint == (byte)'/n'))
{
byte[] retval = new byte[linebuf.count-2];
linebuf.copyto(0,retval,0,linebuf.count-2);

return retval;
}

prevbyte = (byte)currbyteint;

currbyteint = m_strmsource.readbyte();
}


if(linebuf.count > 0)
{
byte[] retval = new byte[linebuf.count];
linebuf.copyto(0,retval,0,linebuf.count);

return retval;
}

return null;
}

/**
*
* 將服務器的返回信息逐行轉換成字符串
*
*/
public string readlinestr(networkstream mystream)
{
byte[] b = readline(mystream);
if( null == b)
{
return null;
}
else
{
return system.text.encoding.ascii.getstring( b );
}
}

這樣一來,我們就能讀到那些以3位應答碼開始,加一個空格,然后是一些發回的數據流,結尾是回車加換行的正確命令格式。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镶黄旗| 太仆寺旗| 宁国市| 那曲县| 崇左市| 越西县| 久治县| 和静县| 宁强县| 临洮县| 文昌市| 开鲁县| 随州市| 河源市| 白沙| 临潭县| 桐乡市| 平远县| 陇川县| 调兵山市| 多伦县| 陵川县| 庆元县| 无棣县| 蕲春县| 遂平县| 盱眙县| 高清| 文化| 平乐县| 浙江省| 长春市| 亚东县| 丹江口市| 海兴县| 汤阴县| 临高县| 天门市| 自治县| 二手房| 苗栗县|