Windows Socket 网络编程二套接字编程原理.docx

上传人:b****2 文档编号:2962207 上传时间:2023-05-05 格式:DOCX 页数:13 大小:43.55KB
下载 相关 举报
Windows Socket 网络编程二套接字编程原理.docx_第1页
第1页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第2页
第2页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第3页
第3页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第4页
第4页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第5页
第5页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第6页
第6页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第7页
第7页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第8页
第8页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第9页
第9页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第10页
第10页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第11页
第11页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第12页
第12页 / 共13页
Windows Socket 网络编程二套接字编程原理.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Windows Socket 网络编程二套接字编程原理.docx

《Windows Socket 网络编程二套接字编程原理.docx》由会员分享,可在线阅读,更多相关《Windows Socket 网络编程二套接字编程原理.docx(13页珍藏版)》请在冰点文库上搜索。

Windows Socket 网络编程二套接字编程原理.docx

WindowsSocket网络编程二套接字编程原理

WindowsSocket网络编程

(二)---套接字编程原理

一、客户机/服务器模式

在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。

该模式的建立基于以下两点:

1、非对等作用;2、通信完全是异步的。

客户机/服务器模式在操作过程中采取的是主动请示方式:

首先服务器方要先启动,并根据请示提供相应服务:

(过程如下)

1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。

2、等待客户请求到达该端口。

3、接收到重复服务请求,处理该请求并发送应答信号。

4、返回第二步,等待另一客户请求

5、关闭服务器。

客户方:

1、打开一通信通道,并连接到服务器所在主机的特定端口。

2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……

3、请求结束后关闭通信通道并终止。

二、基本套接字

为了更好说明套接字编程原理,给出几个基本的套接字,在以后的篇幅中会给出更详细的使用说明。

1、创建套接字——socket()

功能:

使用前创建一个新的套接字

格式:

SOCKETPASCALFARsocket(intaf,inttype,intprocotol);

参数:

af:

通信发生的区域

type:

要建立的套接字类型

procotol:

使用的特定协议

2、指定本地地址——bind()

功能:

将套接字地址与所创建的套接字号联系起来。

格式:

intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);

参数:

s:

是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。

其它:

没有错误,bind()返回0,否则SOCKET_ERROR

地址结构说明:

structsockaddr_in

{

shortsin_family;//AF_INET

u_shortsin_port;//16位端口号,网络字节顺序

structin_addrsin_addr;//32位IP地址,网络字节顺序

charsin_zero[8];//保留

}

3、建立套接字连接——connect()和accept()

功能:

共同完成连接工作

格式:

intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);

SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*name,intFAR*addrlen);

参数:

同上

4、监听连接——listen()

功能:

用于面向连接服务器,表明它愿意接收连接。

格式:

intPASCALFARlisten(SOCKETs,intbacklog);

5、数据传输——send()与recv()

功能:

数据的发送与接收

格式:

intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);

intPASCALFARrecv(SOCKETs,constcharFAR*buf,intlen,intflags);

参数:

buf:

指向存有传输数据的缓冲区的指针。

6、多路复用——select()

功能:

用来检测一个或多个套接字状态。

格式:

intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,

fd_setFAR*exceptfds,conststructtimevalFAR*timeout);

参数:

readfds:

指向要做读检测的指针

writefds:

指向要做写检测的指针

exceptfds:

指向要检测是否出错的指针

timeout:

最大等待时间

7、关闭套接字——closesocket()

功能:

关闭套接字s

格式:

BOOLPASCALFARclosesocket(SOCKETs);

三、典型过程图

2.1面向连接的套接字的系统调用时序图

2.2无连接协议的套接字调用时序图

2.3面向连接的应用程序流程图

1.CString:

:

IsEmpty

BOOLIsEmpty()const;

返回值:

如果CString对象的长度为0,则返回非零值;否则返回0。

说明:

此成员函数用来测试一个CString对象是否为空。

示例:

CStrings;

ASSERT(s.IsEmpty());

2.CString:

:

Left

CStringLeft(intnCount)const;

throw(CMemoryException);

返回值:

返回的字符串是前nCount个字符。

示例:

CStrings(_T("abcdef"));

ASSERT(s.Left

(2)==_T("ab"));

3.CString:

:

LoadString

BOOLLoadString(UINTnID);

throw(CMemoryException);

返回值:

如果加载资源成功则返回非零值;否则返回0。

参数:

nID//一个Windows字符串资源ID。

说明:

此成员函数用来读取一个由nID标识的Windows字符串资源,并放入一个已有CString对象中。

示例:

#defineIDS_FILENOTFOUND1

CStrings;

if(!

s.LoadString(IDS_FILENOTFOUND))

4.CString:

:

MakeLower

voidMakeLower();//改变字符的小写

5.CString:

:

MakeReverse

voidMakeReverse();//字符倒置

6.CString:

:

MakeUpper

voidMakeUpper();//改变字符的大写

7.CString:

:

Mid

CStringMid(intnFirst)const;

CStringMid(intnFirst,intnCount)const;

参数:

nFirst代表要提取的开始索引位,nCount代表要提取的字符数。

示例:

CStrings(_T("abcdef"));

ASSERT(s.Mid(2,3)==_T("cde"));

8.CString:

:

ReleaseBuffer

voidReleaseBuffer(intnNewLength=-1);

参数:

nNewLength

此字符串的以字符数表示的新长度,不计算结尾的空字符。

如果这个字符串是以空字符结尾的,则参数的缺省值-1将把CString的大小设置为字符串的当前长度。

说明:

使用ReleaseBuffer来结束对由GetBuffer分配的缓冲区的使用。

如果你知道缓冲区中的字符串是以空字符结尾的,则可以省略nNewLength参数。

如果字符串不是以空字符结尾的,则可以使用nNewLength指定字符串的长度。

在调用ReleaseBuffer或其它CString操作之后,由GetBuffer返回的地址是无效的。

示例:

CStrings="abc";

LPTSTRp=s.GetBuffer(1024);

strcpy(p,"abc");//直接使用该缓冲区

ASSERT(s.GetLength()==3);//字符串长度等于3

s.ReleaseBuffer();//释放多余的内存,现在p无效。

ASSERT(s.GetLength()==3);//长度仍然是3

9.CString:

:

Remove

intCString:

:

Remove(TCHARch);

返回值:

返回从字符串中移走的字符数。

如果字符串没有改变则返回零。

参数:

ch要从一个字符串中移走的字符。

说明:

此成员函数用来将ch实例从字符串中移走。

与这个字符的比较是区分大小写的。

示例:

//从一个句子中移走小写字母'c':

CStringstr(“Thisisatest.”);

intn=str.Remove('t');

ASSERT(n==2);

ASSERT(str==“Thisisaes.”);

10.CString:

:

Replace

intReplace(TCHARchOld,TCHARchNew);

intReplace(LPCTSTRlpszOld,LPCTSTRlpszNew);

返回值:

返回被替换的字符数。

如果这个字符串没有改变则返回零。

参数:

chOld  要被chNew替换的字符。

chNew  要用来替换chOld的字符。

lpszOld一个指向字符串的指针,该字符串包含了要被lpszNew替换的字符。

LpszNew一个指向字符串的指针,该字符串包含了要用来替换lpszOld的字符。

说明:

此成员函数用一个字符替换另一个字符。

函数的第一个原形在字符串中用chNew现场替换chOld。

函数的第二个原形用lpszNew指定的字符串替换lpszOld指定的子串。

在替换之后,该字符串有可能增长或缩短;那是因为lpszNew和lpszOld的长度不需要是相等的。

两种版本形式都进行区分大小写的匹配。

示例:

//第一个例子,old和new具有相同的长度。

CStringstrZap(“C--”);

intn=strZap.Replace('-','+');

ASSERT(n==2);

ASSERT(strZap==“C++”);

//第二个例子,old和new具有不同的长度。

CStringstrBang(“Everybodylikesicehockey”);

n=strBang.Replace(“hockey”,“golf”);

ASSERT(n==1);

n=strBang.Replace(“likes”,“plays”);

ASSERT(n==1);

n=strBang.Replace(“ice”,NULL);

ASSERT(n==1);

ASSERT(strBang==“Everybodyplaysgolg”);

//注意,现在在你的句子中有了一个额外的空格。

//要移走这个额外的空格,可以将它包括在要被替换的字符串中,例如,“ice”。

11.CString:

:

ReverseFind

intReverseFind(TCHARch)const;

返回值:

返回此CString对象中与要求的字符匹配的最后一个字符的索引;如果没有找

到需要的字符则返回-1。

参数:

ch要搜索的字符。

说明:

此成员函数在此CString对象中搜索与一个子串匹配的最后一个字符。

此函数类似于运行时函数strrchr。

示例:

CStrings("abcabc");

ASSERT(s.ReverseFind('b')==4);

12.CString:

:

Right

CStringRight(intnCount)const;

throw(CMemoryException);

返回值:

返回的字符串是最后nCount个字符。

CStrings(_T("abcdef"));

ASSERT(s.Right

(2)==_T("ef"));

13.CString:

:

SetAt

voidSetAt(intnIndex,TCHARch);

说明:

可以把字符串理解为一个数组,SetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。

Ch更替字符,把nIndex位置上的字符变成ch。

示例:

CStrings("abc");

s.MakeReverse();

ASSERT(s=="cba");

14.CString:

:

TrimLeft

voidTrimLeft();

voidCString:

:

TrimLeft(TCHARchTarget);

说明:

如果没有参数,从左删除字符(\n\t空格等),至到遇到一个非此类字符.当然你也可以指定删除那些字符.如果指定的参数是字符串,那么遇上其中的一个字符就删除.

\n换行符

\tTAB字符

示例1:

CStringstr="\n\ta";

str.TrimLeft();

str为“a”;

示例2:

CStringstr="abbcadbabcadb";

str.TrimLeft("ab");

结果"cadbabcadb"

str.TrimLeft("ac");

结果"bcadbabcadb"

15.CString:

:

TrimRight

voidTrimRight();

voidCString:

:

TrimRight(TCHARchTarget);

voidCString:

:

TrimRight(LPCTSTRlpszTargets);

说明:

用法类似于上面。

16.CString:

:

Compare

intCompare(LPCTSTRlpsz)const;

返回值:

字符串一样返回0,小于lpsz返回-1,大于lpsz返回1,区分大小字符

示例:

CStrings1("abc");

CStrings2("abd");

ASSERT(s1.Compare(s2)==-1);

ASSERT(s1.Compare("abe")==-1

17.CString:

:

CompareNoCase

intCompareNoCase(LPCTSTRlpsz)const;

返回值:

字符串一样返回0,小于lpsz返回-1,大于lpsz返回1,不区分大小字符

18.CString:

:

Collate

intCollate(LPCTSTRlpsz)const;

同CString:

:

Compare

19.CString:

:

CollateNoCase

intCollateNocase(LPCTSTRlpsz)const;

同CString:

:

CompareNoCase

20.CString:

:

CString//构造函数

CString();

CString(constCString&stringSrc);

CString(TCHARch,intnRepeat=1);

CString(LPCTSTRlpch,intnLength);

CString(constunsignedchar*psz);

CString(LPCWSTRlpsz);

CString(LPCSTRlpsz);

示例:

CStrings1;

CStrings2("cat");

CStrings3=s2;

CStrings4(s2+""+s3);

CStrings5('x');                     //s5="x"

CStrings6('x',6);                  //s6="xxxxxx"

CStrings7((LPCSTR)ID_FILE_NEW);       //s7="Createanewdocument"

CStringcity="Philadelphia";

21.CString:

:

Delete

intDelete(intnIndex,intnCount=1);

返回值:

是被删除前的字符串的长度

nIndex是第一个被删除的字符,nCount是一次删除几个字符。

根据我实验得出的结果:

当nCount>要删除字符串的最大长度(GetCount()-nIndex)时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。

示例:

CStringstr1,str2,str3;

chara;

str1="nihao";

str2="nIhao";

intx;

//inti=(str1==str2);     

str1.Delete(2,3);

如果nCount(3)>GetCount()–nIndex(5-2)就会执行错误

22.CString:

:

Empty

VoidEmpty();

返回值:

没有返回值清空操作;

示例:

CStrings("abc");

s.Empty();

ASSERT(s.GetLength()==0);

23.CString:

:

Find

intFind(TCHARch)const;

intFind(LPCTSTRlpszSub)const;

intFind(TCHARch,intnStart)const;

intFind(LPCTSTRlpszSub,intnStart)const;

返回值:

不匹配的话返回-1;索引以0开始;nStar代表以索引值nStart的字符开始搜索,

即为包含以索引nStart字符后的字符串.

示例:

CStrings("abcdef");

ASSERT(s.Find('c')==2);

ASSERT(s.Find("de")==3);

Cstringstr(“Thestarsarealigned”);

Ingn=str.Find('e',5);

ASSERT(n==12)

24.CString:

:

FindOneOf

intFindOneOf(LPCTSTRlpszCharSet)const;

返回值:

不匹配的话返回-1;索引以0开始

注意:

:

返回此字符串中第一个在lpszCharSet中也包括字符并且从零开始的索引值

示例:

CStrings("abcdef");

ASSERT(s.FindOneOf("xd")==3);//'d'isfirstmatch.

25.CString:

:

Format

voidFormat(LPCTSTRlpszFormat,...);

voidFormat(UINTnFormatID,...);

参数:

lpszFormat一个格式控制字符串

nFormatID字符串标识符

示例:

CStringstr;

Str.Format(“%d”,13);//此时Str为13

26.CString:

:

GetAt

TCHARGetAt(intnIndex)const;

返回值:

返回标号为nIndex的字符,你可以把字符串理解为一个数组,GetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。

27.CString:

:

GetBuffer

LPTSTRGetBuffer(intnMinBufLength);

返回值:

一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR指针。

参数:

nMinBufLength//字符缓冲区的以字符数表示的最小容量。

这个值不包括一个结尾的空字符的空间。

说明:

此成员函数返回一个指向CString对象的内部字符缓冲区的指针。

返回的LPTSTR不是const,因此可以允许直接修改CString的内容。

如果你使用由GetBuffer返回的指针来改变字符串的内容,你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。

在调用ReleaseBuffer之后,由GetBuffer返回的地址也许就无效了,因为其它的CString操作可能会导致CString缓冲区被重新分配。

如果你没有改变此CString的长度,则缓冲区不会被重新分配。

当此CString对象被销毁时,其缓冲区内存将被自动释放。

注意:

如果你自己知道字符串的长度,则你不应该添加结尾的空字符。

但是,当你用ReleaseBuffer来释放该缓冲区时,你必须指定最后的字符串长度。

如果你添加了结尾的空字符,你应该给ReleaseBuffer的长度参数传递-1,ReleaseBuffer将对该缓冲区执行strlen来确定它的长度。

示例:

CStrings("abcd");

#ifdef_DEBUG

afxDump<<"CStrings"<

#endif

LPTSTRp=s.GetBuffer(10);

strcpy(p,"Hello");//直接访问CString对象。

s.ReleaseBuffer();

#ifdef_DEBUG

afxDump<<"CStrings"<

#endif

28.CString:

:

GetLength

intGetLength()const;

返回值:

返回字符串中的字节计数。

说明:

此成员函数用来获取这个CString对象中的字节计数。

这个计数不包括结尾的空字符。

对于多字节字符集(MBCS),GetLength按每一个8位字符计数;即,在一个多字节字符中的开始和结尾字节被算作两个字节。

示例:

CStrings("abcdef");

ASSERT(s.GetLength()==6);

29.CString:

:

Insert

intInsert(intnIndex,TCHARch);

intInsert(intnIndex,LPCTSTRpstr);

返回值:

返回修改后的长度,nIndex是字符(或字符串)插入后的索引号例子。

示例:

CStringstr(“HockeyBest”);

intn=str.Insert(6,“is”);

ASSERT(n==str.GetLength());

printf(“1:

%s\n”,(LPCTSTR)str);

n=str.Insert(6,'');

ASSERT(n==str.GetLength());

printf(“2:

%s\n”,(LPCTSTR)STR);

n=str.Insert(555,‘1’);

ASSERT(n==str.GetLength());

printf(“3:

%s\n”,(LPCTSTR)str);

输出:

1:

HockeyisBes

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2