C/S模式
Server:
根据请求提供服务
1.打开一个通信通道并告知本地计算机,它愿意在某一地址和端口上接受客户请求
2.等待客户请求到达端口
3.接收到重复服务请求,处理该请求并发送应答信号。
4.返回2,等待另一客户请求
5.关闭服务
Client
1.打开一个通信通道,并连接到服务器所在主机的特定端口
2.向服务器发送服务请求报文,等待并接受应答,继续提出请求
3.请求结束后关闭
套接字类型
流式套接字(SOCK_STREAM)
数据报式套接字(SOCK_DGRAM)
原始套接字(SOCK_RAW)
基于TCP的socket编程
服务端
1.创建socket
2.将socket绑定到一个本地地址和端口上(bind)
3.将socket设为监听模式,准备接受客户请求(listen)
4.等待客户请求到来:当请求到来后,接受连接请求,返回一个 对应于此次链接的套接字(accept)
5.用返回的套接字和客户端进行通信(send、recv)
6.返回,等待另一个客户请求
7.关闭套接字
客户端
1.创建套接字(socket)
2.向服务器发出链接请求(connect)
3.和服务器进行通信(send、recv)
4.关闭套接字
服务端调用accept后就会等待,等待客户端发connnect,然后服务端接受该请求。服务器需要告诉本地主机它用哪个IP:PORT来等待客户请求,所以需要用bind函数。客户不需要,它发起连接,服务端接收到链接后会知道它用哪个IP:PORT
基于UDP的socket编程
服务端
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; 地址家族,对于tcp、ip必须为 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_addr和inet_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函数将其设置为监听状态,第二个参数指向一个缓冲区的指针,保存客户的ip和port,该缓冲区用来接收连接实体的地址
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 sockSrv和addrSrv
listen将socket设为监听模式,
准备接受客户请求
While(1)
{
Accept等待请求,
返回对应此次链接的套接字
}
6370

被折叠的 条评论
为什么被折叠?



