socket编程流程(使用TCP协议为例)

先来简单回忆一下上一次说到的TCP协议

TCP协议:面向连接、可靠的、流式服务

UDP协议:无连接的、不可靠的、数据报服务

 会发现UDP协议和TCP协议恰好相反,但是既然有了可靠的TCP协议,为什么又要另外一个不可靠的UDP协议呢???

因为UDP有它自己的优点UDP协议是无连接方式的协议,它的效率高,速度快,占资源少,使用起来会更快捷,方便,如一般的聊天软件。

 

下面编写一个编程流程(以TCP协议为例)

 服务器端(server):socket  bind  listen  accept  recv/send  close

  (1)(创建socket)socket(int  domain,int  type,int  protocol)

domain参数表示告诉系统使用哪个底层协议族。我们现在一般还使用IP v4,所以

domain:: 协议簇 AF_INET

type:: 选择协议 SOCK_STREAM(tcp) SOCK_DGRAM(udp)

protocol:: 0

示例:

​
int sockfd = socket(AF_INET,SOCK_TREAM,0)

​

(2) (命名socket)bind (int  sockfd,const struct sockaddr* my_addr,socklen_t  addrlen)

 sockfd:相当于文件描述符

             my_addr:将my_addr所指的socket地址分配给未命名的sockfd文件描述符。指定 IP 地址和端口号,里面有三部分,地                                 址簇、端口号、IP地址。

             addrlen:socket地址的长度。

​
struct sockaddr_in

{

    sa_family_t sin_family; // 地址簇 AF_INET

    u_int16_t sin_port; 
// 端口号 。网络字节序(大端模式) PC 机(小端模式)  函数htons(主机字节序转化为网络字节序)

    struct in_addr sin_addr; // IP 地址
    
}

​

 

struct in_addr

{
    u_int32_t s_addr; // IP 地址最终的表示   这里需要用  inet_addr来转化ip地址。
}

(3)(监听socket)listen(int sockfd ,int backlog)

backlog:指所有处于半连接状态和完全连接状态的socket的上限。典型值为5。


(4)(接收连接)acceptint  sockfd,struct sockaddr  *addr, socklen_t  *addreln)

返回值: 获取到的和客户端连接的文件描述符

addr:; 记录客户端的 IP 地址和端口号

addrlen:该ocket地址的长度。


(5)recv/send

     recv:(int sockfd ,void *buf, size_t  len,int  flags)

     Send(int sockfd ,const void *buf, size_t  len,int  flags)

 


(6)(关闭连接)close(int sockfd)

 

客户端(client):socket    connect  recv/send  close

这里不同的就是connect发起连接函数

int connect(int sockfd, struct sockaddr* addr, int addrlen);

addr:: 要连接的服务器的 IP 地址和端口号。

 

下面是代码显示:

服务器端(ser)


 

 客户端(cli)

 
 

 

 

   

 

猜你喜欢

转载自blog.csdn.net/ShWe_yayaya/article/details/81637768