网络编程——cs架构及tcp编程

一、cs架构

服务器                                                                           客户端

创建套接字 -----socket()                                   创建套接字----socket()

绑定本机ip和端口号-----bind()

创建套接字监听------listen()

等待连接-----accept()                                        发起连接-------connect()

接发数据----read()/write()                              接发数据-------read()/write()

关闭套接字-----close()                                        关闭套接字------close()

二、服务器的TCP编程

①创建套接字

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

函数原型:

   int socket(int domain, int type, int protocol);
   参数:
       domain:地址族 //每一个不同的协议,地址结构不同
           AF_UNIX: 域套接字
           AF_INET:IPV4协议   //=PF_INET(重定义)
           AF_INET6:IPV6协议
   type:套接字类型
           SOCK_STREAM:流式套接字 -- 唯一对应tcp通信
           SOCK_GDRAM:数据报套接字 -- 唯一对应udp通信
   protocol:
           默认值填0;   
   返回值:
           成功返回一个套接字,失败返回-1; 

 ②绑定ip和端口号

#include <sys/types.h>          /* See NOTES */
   #include <sys/socket.h>    
   #include <netinet/in.h>
   #include <netinet/ip.h> 

函数原型:

   int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
   参数:
       sockfd:socket创建得到的套接字
       addr: 服务器的地址结构首地址
    addrlen:服务器地址结构的大小
   返回值:成功返回0,失败返回-1;
       
       IPV4对应的地址结构:
              struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr sin_addr;   /* internet address */
           };
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           }; 
           s_addr才是绑定ip地址的变量    
           例:
                   struct sockaddr_in saddr;
                   saddr.sin_family = AF_INET; //ipv4协议
                   saddr.sin_port = 8888;   //设置端口号为8888
                   saddr.sin_addr.s_addr = inet_addr("192.168.7.220"); //将点分十进制的地址转换为整型再赋值

注意:ip有两种表达方式,一种是点分十进制,一种是二进制。

         相关转换函数为:inet_addr(点分十进制转二进制)   inet_ntoa(二进制转点分十进制)

③创建套接字监听器 

 #include <sys/types.h>          /* See NOTES */
   #include <sys/socket.h>

函数原型:

   int listen(int sockfd, int backlog);
   参数:
       sockfd:套接字
       backlog:客户端连接的最大等待队列长度 
   返回值:成功返回0,失败返回-1;

④ 等待客户端连接

 #include <sys/types.h>          /* See NOTES */
   #include <sys/socket.h>

函数原型:

   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
   参数:
       sockfd:socket创建得到的套接字
       addr:客户端的地址结构首地址
       addrlen: 客户端地址结构的长度的首地址
   返回值:
       成功返回一个新的套接字(读写套接字),该套接字用于服务器的数据读写,失败返回-1

⑤向服务器连接

 #include <sys/types.h>          /* See NOTES */
   #include <sys/socket.h>

函数原型:

   int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
   参数:
       sockfd:套接字
       addr:服务器的地址结构的首地址
       addrlen:服务器地址结构的大小 
   返回值:成功返回0,失败返回-1; 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值