基于TCP协议的客户端与服务器端程序

来源:互联网 发布:三维产品动画演示软件 编辑:程序博客网 时间:2024/06/07 10:07

            在TCP客户端/服务器程序中,tcp_server.c的作用是接受client.c请求,并与client进行简单的数据通信,是一个阻塞式地通信工具,基于此,先介绍几个简单的socket API,均在sys/socket.h中;

        (1)socket函数

        

        domain指明了协议族/域,通常AF_INET、AF_INET6、AF_LOCAL等,对于IPV4采用AF_INET;

        type是套接口类型,主要SOCK_STREAM、SOCK_DGRAM、SOCK_RAW,对于TCP采用SOCK_STREAM;

        protocol一般取为0。成功时,返回一个小的非负整数值,与文件描述符类似。

        (2)bind函数

         

         当socket函数返回一个描述符时,只是存在于其协议族的空间中,并没有分配一个具体的协议地址(这里指IPv4/IPv6和端口号的组合),bind函数可以将一组固定的地址绑定到sockfd上。成功返回0,失败返回-1。

其中:

sockfd是socket函数返回的描述符;

myaddr指定了想要绑定的IP和端口号,均要使用网络字节序-即大端模式;

addrlen是前面struct sockaddr(与sockaddr_in等价)的长度。

struct sockaddr_in {
       short int sin_family; /* 地址族 */
       unsigned short int sin_port; /* 端口号 */
       struct in_addr sin_addr; /* Internet地址 */
       unsigned char sin_zero[8]; /* 与struct sockaddr一样的长度 */
   };

       (3)listen函数

        

        listen声明sockfd处于监听状态,并且最多允许backlog个客户端处于链接等待状态,该参数至少为1,一般设置为5;成功返回0,失败返回-1。

       (4)accept函数

        

        accept由服务器调用,第二个参数为输出型参数,第三个参数为输入输出型参数。

       (5)connect函数

         

         通过此函数建立于TCP服务器的连接,实际是发起三次握手过程,仅在连接成功或失败后返回。参数sockfd是本地描述符,addr为服务器地址,addrlen是socket地址长度。

        (6)将字符串形式的点分十进制转换成32bit的整数

          

        (7)将32bit的整数转换成点分十进制

          


基于TCP协议的客户端与服务器端程序

单进程版本(tcp_server.c  先读后写    tcp_client.c  先写后读)

tcp_server.c(先读后写)




tcp_client.c(先写后读)


多进程版本  

      在多进程中孙子进程成为主要执行代码的进程,在其中孙子进程为孤儿进程,被1号进程收养。

在tcp_server.c中可作如下改变:
       

多线程版本

      在tcp_server.c中作如下改动:

         

      

      

      以上为基于TCP协议的三种客户端与服务器端程序,客户端程序基本相同,重点在于对服务器端的改写;

      在此,说明一下server bind 失败的原因?

      启动Server端,后在启动Client端,使用CTRL+C终止掉Server端,这时再运行Server端,则显示绑定错误:address already in use,这是什么原因呢?

       这是因为,虽然Server端的应用程序停止了,但TCP协议层的连接并没有完全断开,因此不能再次监听同样的Server端口,若此时,将客户端的应用程序停掉,client终止时自动关闭socket描述符,Server的TCP连接收到Client端发出的FIN端后处于TIME_WAIT状态,TCP协议规定主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间后才能回到CLOSED状态,因为先终止了Server端,所以Server端是主动关闭连接的一方,在TIME_WAIT期间不能再次监听同样的Server端口,必须在一段时间过后才可监听,这就是Server端在关闭后不能马上重启的原因。

      

      

       


         

         


         

        

      

        

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 懒癌和拖延症怎么办 有严重的拖延症怎么办 有拖延症的人怎么办 10多天月经不停怎么办 20多天月经不停怎么办 月经来了十几天不停怎么办 例假20多天不停怎么办 苹果6dns被劫持怎么办 工地欠工资不给怎么办 买的狗得病了怎么办 剖腹产9天刀口痒怎么办 剖腹产6天刀口痒怎么办 剖腹产2年刀口痒怎么办 破腹产9天刀口痒怎么办 破腹产7天刀口痒怎么办 剖腹产8天伤口痒怎么办 刨腹产9天刀口痒怎么办 破腹产8天刀口痒怎么办 二胎刀口1.1mm薄怎么办 土豪养成记2闪退怎么办 爱上不该爱的人怎么办? 有妇之夫爱上我,怎么办 全身起疙瘩很痒怎么办 怀孕了肚子很痛怎么办 月经来肚子疼的厉害怎么办 孕妇9个月肚子疼怎么办 斗鱼身上长白点怎么办 8个月宝宝肚子疼怎么办 1岁半宝宝肚子痛怎么办 3岁宝宝肚子疼怎么办啊 吃的太辣肚子疼怎么办 2岁半宝宝肚子疼怎么办 2岁宝宝肚子痛哭怎么办 怀孕3个月拉肚子怎么办 一岁宝宝消化不良拉肚子怎么办 后背长好多痘痘怎么办 身上起疹子很痒怎么办 背上长好多痘痘怎么办 月经两三个月不来怎么办 来月经很少是褐色的怎么办 例假一天就没了怎么办