网络编程基础篇

  href="file:///E:/temp/msohtml1/01/clip_filelist.xml" rel="File-List" />

C/S模式

Server:

根据请求提供服务

1.打开一个通信通道并告知本地计算机,它愿意在某一地址和端口上接受客户请求

2.等待客户请求到达端口

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

4.返回2,等待另一客户请求

5.关闭服务

 

Client

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

2.向服务器发送服务请求报文,等待并接受应答,继续提出请求

3.请求结束后关闭

 

套接字类型

       流式套接字(SOCK_STREAM

       数据报式套接字(SOCK_DGRAM)

       原始套接字(SOCK_RAW)

 

基于TCPsocket编程

服务端

1.创建socket

2.将socket绑定到一个本地地址和端口上(bind

3.将socket设为监听模式,准备接受客户请求(listen

4.等待客户请求到来:当请求到来后,接受连接请求,返回一个 对应于此次链接的套接字(accept

5.用返回的套接字和客户端进行通信(sendrecv

6.返回,等待另一个客户请求

7.关闭套接字

客户端

1.创建套接字(socket

2.向服务器发出链接请求(connect

3.和服务器进行通信(sendrecv

4.关闭套接字

 

服务端调用accept后就会等待,等待客户端发connnect,然后服务端接受该请求。服务器需要告诉本地主机它用哪个IPPORT来等待客户请求,所以需要用bind函数。客户不需要,它发起连接,服务端接收到链接后会知道它用哪个IPPORT

 

基于UDPsocket编程

服务端

1.创建套接字(socket

2.将套接字绑定到一个到一个本地地址和端口上(bind

3.等待接受数据(recvfrom

4.关闭套接字

 

客户端

1.创建套接字(socket

2.向服务器发送数据(sendto

3.关闭套接字

 

相关函数

Int  WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );

加载套接字库,进行套接字库的版本协商,确定使用的socket版本

wVersionRequested用来指定准备加载的Winsock库的版本,高位字节指定所需要的Winsock库的副版本,而低位字节则是主版本。

 

Socket函数

Socket(  int af,int type int protocal)

Af指定地址族 只能是AD_INET

Type指定socket类型 SOCK_STREAM SOCK_DGRAM

Protocol是与特定的地址家族相关的协议,推荐为0,系统自动选择合适协议

 

Bind函数

将套接字绑定到本地某个地址和端口上

Int bind( SOCKET s, const struct sockaddr FAR* name, int namelen )

第一个参数是要绑定的套接字

第二个参数指定该套接字的本地之信息

 

Struct sockaddr{

U_short sa_family;   地址家族,对于tcpip必须为 AF_INET

Chat sa_data[14]     内存区,指定协议相关信息

}

可以使用sockaddr_in替换sockaddr

Sockaddr_In{

       Short sin_famuly;    地址族,AF_INET

       Unsigned short sin_port;  端口地址

       Struct in_addr sin_addr   主机ip地址

       Char sin_zero[8];    填充数

}

 

In_addr{

       Union{

              Struct { u_Char s_b1,s_b2,s_b3,s_b4; }S_un_b;

              Struct{ u_short s_w1,s_w2; } S_un_w;

              U_long S_addr;

       }S_un;

}

 

Inet_addrinet_ntoa函数

可以将ip地址指定为INADDR_ANY,允许套接字向任何分配给本机的ip地址发送或接收数据。

如果只想让套接字使用多个ip中的一个地址,就必须指定实际地址

Unsigned long inet_addr( const char FAR* cp );

Inet_addr函数需要一个字符串作为参数,用点分十进制

Inet_ntoa做相反的转换

 

Int listen( SOCKET s,int backlog )

第二个参数是等待连接队列的最大长度,如果设置为SOMAXCONN,那么下层的服务提供者将负责将这个套接字设置为最大合理值。

 

SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen)

第一个参数指定的套接字已经通过listen函数将其设置为监听状态,第二个参数指向一个缓冲区的指针,保存客户的ipport,该缓冲区用来接收连接实体的地址

 

Int Send( SOCKET s,const chat FAR* buf,int len,int flags )

第四个参数一般为0即可

 

Int recv( SOCKET s,const FAR* buf,int len,int flags )

 

Int connect( SOCKET s, const struct sockaddr FAR* name, int namelen )

 

U_short Htons( u_short hostshort ); u_short类型的值从主机字节顺序转换为tcpip网络字节顺序

U_long htonl( u_long hostlong )功能类似

 

例子:

TcpSrv                                                     TcpClient

 

建立socket   sockSrv                             建立socket sockClient

建立sockaddr  addrSrv                            connect

Bind  sockSrvaddrSrv                        

listensocket设为监听模式,               

准备接受客户请求                                  

                                                              

While(1)                                                  

{                                                            

       Accept等待请求,                           

返回对应此次链接的套接字                    

}                                                            

                                                              

                                                              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值