基于TCP的C/S程序设计报告

1 课题描述

在 Windows操作系统下,使用Socket 编程实现两个进程之间的通信,两个进程间使用TCP 建立可靠连接, 熟悉 TCP 协议以及套接字编程原理;两个进程间使用C/S 工作模式,在此结合并发服务器原理,实现服务器同时与多进程之间进行通信,深入了解 C/S 工作模式。
TCP 是传输层的应用协议,可通过多方而来保证数据传输的可靠性, 它采用了停止等待方式来回应数据的接收,只有当接收到数据时,用户才发送数据确认报文,同时此协议使用滑动窗口方法来控制网络拥塞,提高数据传输的可靠性。
基于TCP/IP 协议和套接字编程原理为服务器端完成基本数据配置,主要采用套接字编程原理 ,通过调试运行并且经过完善后,实现并发服务器功的能. 在这次课程设计的过程中,对于网络编程有了更深一步的了解。首先是对于计算机网络基础这方面,对于网络体系中的几种分层方法,每层的作用都有了系统的理解 ,特别是对于 Socket 编程这一块,套接字的创建、绑定以及使用,基于 TCP、UDP 的编程以及并发服务器的原理都有了深一步的理解, 这次课程设计对于以后进行网络的开发有很大的帮助。

本课题目标是实现局域网用户之间的即时交流和文件传输,通过基础的网络 SOKET 编程, 为局域网内部的即时通信提供一 个简单而较安全的解决方案

2 系统原理

1.因为TCP是面向连接的,所以在写基于TCP服务器的代码时,要有listen套接字和accept套接字,而基于UDP模型的代码,并且UDP客户端直接调用 recvfrom/sendto 直接通信即可,不用调用connect函数,这也分别体现出了它们的特性TCP面向连接,而UDP则是无需连接。
  2.对于read在网络通信中,因为 TCP是基于字节流的,所以每次read上来的数据都是一个数据段。可能你这里发了一个1024字节的数据,到了运输层可能分段,所以对端可能不会一次性对上来1024字节的数据。所以由此看出来read每次读socket的文件的时候,都读的是一个数据段。
  3.对于阻塞socket而言,write调用的时候,当我们把应用层的数据拷贝到内核缓冲区的时候,如果内核缓冲区已满,那么就会阻塞,从write 函数返回也并不代表,数据发送到了对端,只是代表了数据已经拷贝到了内核缓冲区。
  4.对于UDP来说,因为是不可靠的,所以也就UDP socket也就没有内核缓冲区,网络层加上包头后直接把数据发送到 数据链路层 的 队列中。从write 返回就是代表数据报已经写入到了数据链路队列。如果 我们发的应用层数据大于 SO_SNDBUF(套接字发送缓冲区上限) 会收到 EMSGSIZE 错误,这不像TCP会阻塞。
  如果链接队列满了,因为是UDP协议栈向上报错,一直到发送方。UDP 并不会重传,所以内核会向应用层返回一个 ENOBUFS 。
  5.内核的TCP发送缓冲区会一直缓存从应用层拷贝到的数据,一直到收到ACK后,才把这些数据丢弃。
  6.write成功返回,对于 TCP来讲只是应用层数据被拷贝到了内核发送缓冲区中,对于 UDP来讲只是数据被加入到了 数据链路层队列中。
  7.connect调用失败后,并不可以直接重用该socket,重用前需 close再用,因为基于 Tcp状态转换图得知 , connect 函数其实就是三次握手,那么当三次握手失败的话,socket 不是处于 CLOSED 而是SYN_SENT状态,所以我们必须重新关闭才能再次使用该 socket。
  8.对于sockaddr 结构体的疑问,为什么这些socket api 不直接使用void* , 而使用这个通用结构体,因为socket api 比 c 语言的 void * 更早出世,所以在当时没有 void* 这一概念的时候就使用了通用结构体来充当void*。

3 系统概要设计

如图3.1socket模型创建流程图:

在这里插入图片描述

4 系统详细设计

4.1 TCP server

首先我们需要先有个套接字,这个套接字必须绑定服务器相应的iP地址和port端口号。而且这个套接字需要是listen状态的。那么当有client向TCP发送连接时,服务器进程调用accept函数就可以查看listen的未决连接队列是否有未处理的连接,如果有就创建一个相应client连接的套接字返回,这时我们就可以通过这个accept套接字和client通信了。

步骤:
1 socket调用

2 bind 绑定服务器ip和端口号

3 listen 使该套接字成为监听状态

4 accept 调用拿到与相应cilent绑定的套

4.2 TCP client

首先调用socket 申请套接字,然后调用connect连接server的ip/port,connect返回的这个套接字,就可以与server通信。

4.3系统中是使用的主要函数

4.3.1 int socket (int domain,int type,int protocl)

第一个参数 指网络层是什么类型的协议, ipv4 ipv6 之一类。
第二个参数 指传输的数据流的类型,tcp 为 sock_stream

第三个参数 基于1/2参数选项组

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值