TCP程序开发步骤

TCP是面向连接的协议,需要通信双方首先建立一个连接。因为TCP可靠、稳定的特点,它被应用于大部分场合,但它对系统资源要求比较高。

TCP协议服务端程序的开发流程如下所示。

// 初始化Winsock库,获得协议版本
// 创建服务Socket对象 (指定协议类型,地址族信息)
// 绑定Socket (将指定的IP,端口绑定给Socket)
// 开始监听,并且设置监听数量. (开始监听后,客户端就可以连接成功)
// 开启端口,接收连接
// 收发数据(利用建立连接的Socket对象进行通信)
// 关闭Socket连接
// 终止Winsock库的调用

开发一个TCP服务端程序,在完成初始化Winsock库创建套接字(Socket)对象两个通用步骤后,还要完成如下步骤。

(1)绑定套接字到指定IP地址和端口

无论是使用哪种协议的服务端程序,都要将服务端的IP地址和端口绑定给先前创建的套接字,客户端程序将与之进行通信。绑定套接字的函数是bind,原型如下。

int bind(
 SOCKET s, //套接字句柄
 const struct sockaddr FAR *name,    //要绑定的地址
 int namelen                         //name所指定的地址长度
);

第一个参数s是要绑定地址的套接字句柄,由socket函数返回。

第二个参数name是指向sockaddr结构体的指针,用来指定套接字所绑定的地址。

对于TCP、UDP协议,该地址通常是IP地址和端口号,对于TCP、UDP协议使用sockaddr_in结构体代替sockaddr。其定义如下。

struct sockaddr_in {
    short  sin_family;      //地址家族(地址格式),Windows为AF_INET
    u_short sin_port;       //端口号
    struct in_addr sin_addr; //IP地址
    char  sin_zero[8];     //占位值,通常为0
};

第一个成员sin_family同socket函数的af参数。

第二个成员sin_port指定了TCP或UDP通信服务的端口号。应用程序选择端口号时应该注意,如0~1023由IANA(Internet Assigned Numbers Authorith)管理,保留为公共服务使用,普通用户应用程序应该选择1024以上的端口号。同时需要注意,这里的值使用的是网络字节顺序,而计算机中存储的数字是主机字节顺序。Winsock库提供了一系列转换函数用于两种顺序之间的转换,如下所示。

u_short htons(u_short hostshort); //将u_short类型由主机字节顺序转换为网络字节顺序
u_long htonl(u_long hostlong);    //将u_long类型由主机字节顺序转换为网络字节顺序
u_short ntohs(u_short netshort);  //将u_short类型由网络字节顺序转换为主机字节顺序
u_long ntohl(u_long netlong);     //将u_long类型由网络字节顺序转换为主机字节顺序

例如我们要使用端口6000,那么应该是sin_port = htons(6000);

第三个成员sin_addr用来存储IP地址,它被定义为一个联合来处理整个32位的值,定义如下。

struct 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;

我们知道IP地址由四个部分组成,每个部分由点分开,通常是“xxx.xxx.xxx.xxx”格式。实际上IP地址是一个32位数据,即四个字节构成,每个字节对应由点分开的每个部分。所以每部分的最大值是255。如果直接使用字符串为此成员赋值,通常需要进行转换,Winsock库提供了如下转换函数。

unsigned long inet_addr(const char  FAR *cp);
char FAR * inet_ntoa(struct  in_addr in);

其中inet_addr函数的作用是将用字符串表示的IP地址准换为网络字节顺序的32位值。

inet_ntoa函数的作用是将用网络字节顺序32位值表示的IP地址转换为用字符串表示的IP地址。

第四个成员sin_zero是为了与sockaddr结构大小相同而设置的,没有其他含义。

函数执行成功则返回0,否则返回SOCKET_ERROR,使用WSAGetLastError函数获得错误代码。

(2)监听连接

当套接字完成绑定指定IP地址和端口号后就应该设置套接字进入监听状态,也就是监听客户端的连接。使用listen函数,原型如下。

int listen(
 SOCKET s,   //套接字句柄
 int backlog  //监听队列中允许保持尚未处理的最大连接数量);

当服务端设置套接字进入监听状态,并且排队尚未满的情况下,客户端的连接函数就可以连接成功,否则客户端的连接函数将处理阻塞状态,直到连接成功或超时。

(3)接受连接请求

当服务端套接字进入监听状态后,接着应该使用accept函数接受排队等候的连接,如果有排队等候连接则立即返回完成连接,否则accept函数将进入阻塞状态,直到有连接到来,或者socket对象被关闭。accept函数原型如下。

SOCKET accept(
SOCKET s, //套接字句柄
struct sockaddr FAR *addr, //指向sockaddr_in结构的指针,用于接收对方的地址
int FAR *addrlen     //addr指针指向内存的大小
);

该函数在套接字s上取出未处理连接中的第一个连接,然后为这个连接创建新的套接字并返回其句柄,后期的数据的收发就是使用这个新套接字来完成的。

TCP客户端程序的开发流程如下所示。

// 初始化Winsock库,获得协议版本
// 创建服务Socket对象 (指定协议类型,地址族信息)
// 连接(向指定IP和端口的服务器进行连接)
// 收发数据(利用建立连接的Socket对象进行通信)
// 关闭Socket连接
// 终止对Winsock的调用

而对于TCP客户端程序的开发,在完成初始化Winsock库创建套接字(Socket)对象两个通用步骤后,接下来就是使用connect函数发起对服务端的连接,函数原型如下。

int connect(SOCKET s,            //套接字句柄
const struct sockaddr FAR *name, //指向sockaddr_in结构的指针,指定要连接的服务器的地址
int namelen  //addr指针指向内存的大小
);

函数执行成功返回0,之后就可以利用套接字s进行收发数据。函数执行失败返回SOCKET_ERROR,使用WSAGetLastError函数进一步获得错误代码。

无论是TCP协议的服务端程序还是客户端程序,发送数据都是使用send函数,原型如下。

int send(
 SOCKET s,               //已建立连接的套接字句柄
 const char FAR *buf,    //要发送的内容所在内存首地址
 int len,                //发送内容的长度
 int flags               //指定调用方式,通常置为0
);

函数执行成功后返回实际发送数据的字节数。

接收数据使用recv函数,原型如下。

int recv(
 SOCKET s,          //已建立连接的套接字句柄
 char FAR *buf,     //要接收的内容所在内存首地址
 int len,           //接收数据缓冲区的长度
 int flags          //指定调用方式,通常置为0);

函数执行成功后返回实际接收数据的字节数。在阻塞模式下,recv将阻塞线程的执行,直至接收到数据。

原文地址:https://www.cnblogs.com/cyx-b/p/12535263.html

时间: 2024-10-04 02:22:30

TCP程序开发步骤的相关文章

02-第一个iOS程序-开发步骤

打开Xcode 选择项目模板 Single View Application是最适合初学者的模板 设置项目属性 运行程序 不管怎样,先运行第一个iOS程序看看效果先(用快捷键Command + R 也行) 运行结果 Xcode会启动一个iOS模拟器来运行程序 程序的运行结果如右图所示,白白一片 后面我们得往这空白界面上增添各种各样的控件元素 窥探项目环境 项目创建完毕后,自动帮我们做了很多配置,也自动生成了很多文件 还自动添加了开发所依赖的框架: 如何搭建UI界面 项目中这么多文件,哪些是影响着

程序开发步骤

程序:是为了实现特定目标或者解决特定问题而用计算机语言编写的命令序列的集合,简单意思就是             完成某些事情的一种既定方式和过程.(个人理解就是你妈叫你打酱油,你下楼,然后去超市买酱油等等这一过程联系到一起) 下面我教大家用Java语言编写程序 第一步:编写程序HelloWorld.java文件(注意 代码文件是文本文档,这个是源文件代码文件) public class HelloWorld{ public static void main(String[]args){   S

GUI 程序开发步骤

1.继承Jframe2.定义需要的组件3.创建组件4.设置布局管理器5.添加组件6.设置显示窗体 /** * @Package: com.Gui * @author: Leon * @date::2017年7月15日 上午11:17:46 * @Description: 边界布局讲解演示 * 1. 继承一个 JFrame * 2.定义你需要的组件 * 3.创建组件(构造函数)* 设置布局(默认缺省),使用其它布局需要定义不可省略. * 4.添加组件 * 5.对窗体进行设置 */ package

网络编程之TCP客户端开发和TCP服务端开发

开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': # 创建tcp客户端套接字 # 1. AF_INET:表示ipv4 # 2. SOCK_STREAM: tcp传输协议 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和服务端应用程序建立连接 tcp_c

微信小程序开发视频教程

课程:拜师学艺,微信小程序从入门到大神必经之路(第一季,共四季) 课程观看地址:http://www.xuetuwuyou.com/course/172/lesson/list 课程出自学途无忧网:http://www.xuetuwuyou.com 讲师:风舞烟 课时列表: 第一部_诞生 - 天降大任:名门贵族,互联网开发新宠--小程序横空出世 第1章 : 忽如一夜春风来--小程序的前世今生 课时1:课程开场 课时2:本章目标及任务 课时3:第一回合_小王子出世-微信小程序_小程序为什么这么火

小程序·巧应用,微信小程序开发实战

系统全面地讲解微信小程序的开发技术.开篇创建一个小程序项目并解析体验,介绍如何由零开始创建一个小程序,全面体验小程序的开发工具.界面.开发框架.实现过程及其主要代码框架,了解小程序的应用场景及开发要求.接着介绍小程序开发基础,包括小程序开发的语言与语法.函数方法.模块.事件交互等.然后详细介绍了组件的应用与开发,包括开发过程与组件应用技巧,还详细分析了API接口,包括使用各个微信原生API接口进行小程序开发的技巧.最后介绍了几个小程序实战案例,让读者实践小程序各项能力的应用及掌握一些应用技巧.本

linux网络编程 基于TCP的程序开发

面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你会觉得这样子的开发毫无激情.为什么TCP的开发就要按照这样的流程来呢?而且一般出的问题几乎都不在这几个系统调用上,原因何在?当我们弄清网络开发的本质,协议栈的设计原理.数据流向等这些问题的答案也就会慢慢浮出水面了.接下来这几篇博文主要是围绕网络编程展开,目的是引出后面对于Linux下TCP/IP协议

关于微信小程序的开发步骤

~~~~包子最近在研究小程序 首先先讲一下小程序一些基本的步骤: 1.登录微信的公众平台,选择小程序,注册一个账号,期间有碰到什么交300块钱的就不要理他,因为我只是做demo,当然,准备上线的企业啥的得交,因为你不交你就审核不过去 2.注册完之后,首先在首页那里下载微信小程序开发工具,点击下载.然后安装 3.在下载开发工具的同时,我们去查一下自己的APPId..这个不要随便给别人看哦,,保密哒..... 4.接下来我们打开我们下载的微信开发工具,扫一下我们绑定的二维码,新建项目,选择一个空的目

java开发GUI程序一般步骤:

开发GUI程序一般步骤: 1. 引包 import java.awt.*; import javax.swing.*; 2. 继承JFrame public class Demo3 extends JFrame {} 3. 定义需要的组件 //3.定义组件 JButton jb1,jb2,jb3,jb4,jb5; int size=9; JButton jbs[]=new JButton[size]; //先分配初始空间 4. 创建组件 //4.创建组件 jb1=new JButton("中部&