TCP编程函数和步骤详解

   TCP编程的服务器端一般步骤是

  1、 创建一个socket,用函数socket();

  2、 设置socket属性,用函数setsockopt(); * 可选

  3、 绑定IP地址、端口等信息到socket上,用函数bind();

  4、 开启监听,用函数listen();

  5、 接收客户端上来的连接,用函数accept();

  6、 收发数据,用函数send()和recv(),者read()和write();

  7、 关闭网络连接;

  8、 关闭监听;

  TCP编程的客户端一般步骤是:

  1、 创建一个socket,用函数socket();

  2、 设置socket属性,用函数setsockopt();* 可选

  3、 绑定IP地址、端口等信息到socket上,用函数bind();* 可选

  4、 设置要连接的对方的IP地址和端口等属性;

  5、 连接服务器,用函数connect();

  6、 收发数据,用函数send()和recv(),或者read()和write();

  7、 关闭网络连接;

  UDP编程的服务器端一般步骤是:

  1、 创建一个socket,用函数socket();

  2、 设置socket属性,用函数setsockopt();* 可选

  3、 绑定IP地址、端口等信息到socket上,用函数bind()

  4、 循环接收数据,用函数recvfrom();

  5、 关闭网络连接;

  UDP编程的客户端一般步骤是:

  1、 创建一个socket,用函数socket();

  2、 设置socket属性,用函数setsockopt();* 可选

  3、 绑定IP地址、端口等信息到socket上,用函数bind();* 可选

  4、 设置对方的IP地址和端口等属性;

  5、 发送数据,用函数sendto();

  6、 关闭网络连接;

  常用的网络命令:

  netstat

  命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可以使用帮助

  telnet

  telnet是一个用来远程控制的程序,但是我们完全可以用这个程序来调试我们的服务端程序的. 比如我们的服务器程序在监听8888端口,我们可以用telnet localhost 8888来查看服务端的状况

  数据结构

  1、地址结构

  struct sockaddr_in {

  short int sin_family; /* 地址族 一般为AF-INET */

  unsigned short int sin_port; /* 端口号 */

  struct in_addr sin_addr; /* IP地址 */

  unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 使用memset()或bzero()来填充*/

  };

  struct sockaddr {

  unsigned short sa_family; /* 地址族, AF_xxx */

  char sa_data[14]; /* 14 字节的协议地址 */

  };

  2、DNS结构

  struct hostent {

  char *h_name; /* 主机的官方域名 */

  char **h_aliases; /* 一个以NULL结尾的主机别名数组 */

  int h_addrtype; /* 返回的地址类型,在Internet环境下为AF-INET */

  int h_length; /*地址的字节长度 */

  char **h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/

  };

  操作函数

  1、 socket:

  创建socket 描述符

  int socket(int domain, int type, int protocol);

  domain=AF_INET,socket的类型,type=SOCK_STREAM 或SOCK_DGRAM,分别表示TCP连接和UDP连接;protocol=0。

  返回一个整型socket描述符。

  2.bind:

  将socket描述符与你本机上的一个端口相关联(仅用于服务器)

  int bind(int sockfd,struct sockaddr *my_addr, int addrlen);

  Sockfd是一个socket描述符

  my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;

  addrlen=sizeof(struct sockaddr)。

  返回:成功=0;失败=-1,errno=错误号。

  可以用下面的赋值自动获得本机IP地址和随机获取一个没有被占用的端口号:

  my_addr.sin_port = 0; /* 系统随机选择一个未被使用的端口号 */

  my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本机IP地址 */

  3.Connect:

  与远端服务器建立一个TCP连接 (用于客户端)

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

  Sockfd是目的服务器的sockt描述符

  serv_addr是包含目的机IP地址和端口号的指针。

  返回:成功=0;失败=-1,errno=错误号。

  4、Listen:

  监听是否有服务请求 ,用于bind()后

  int listen(int sockfd, int backlog);

  Sockfd是Socket系统调用返回的socket 描述符;

  backlog指定在请求队列中允许的最大请求数,缺省值为20。

  返回:成功=0;失败=-1,errno=错误号。

  5.accept:

  接受来自客户的请求

  int accept(int sockfd, void *addr, int *addrlen);

  sockfd是被监听的socket描述符,

  addr 是指向sockaddr_in变量的指针,存放客户主机的信息 ;

  addrten 指向值为sizeof(struct sockaddr_in)的整型指针变量。

  返回:成功返回一个新的socket描述符,来供这个新连接来使用。 错误发生时返回一个-1并且设置相应的errno值。

  6.Send:

  在连接(TCP)的socket方式下发送信息

  int send(int sockfd, const void *msg, int len, int flags);

  Sockfd是用来传输数据的socket描述符

  msg是一个指向要发送数据的指针。

  Len是以字节为单位的数据的长度。

  flags一般情况下置为0。

  7.recv:

  在连接(TCP)的socket方式下接收数据

  int recv(int sockfd,void *buf,int len,unsigned int flags);

  Sockfd是接受数据的socket描述符;

  buf 是存放接收数据的缓冲区;

  len是缓冲的长度。

  Flags也被置为0。

  返回:实际上接收的字节数,如果连接中止,返回0,。出现错误时,返回-1并置相应的errno值。

  8.sendto:

  在在无连接(UDP)的socket方式下发送数据

  int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);

  to表示目地机的IP地址和端口号信息

  tolen=sizeof (struct sockaddr)。

  返回:实际发送的数据字节长度或在出现发送错误时返回-1。

  9.Recvfrom()

  在无连接(UDP)的socket方式下接收数据

  int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);

  from 保存源机的IP地址及端口号。

  fromlen=sizeof(struct sockaddr)。

  返回:实际存入from中的数据字节数。当出现错误时返回-1,并置相应的errno。

  10.close()

  释放socket,停止任何数据操作

  close(sockfd);

  11.shutdown:

  单向关闭连接

  int shutdown(int sockfd,int how);

  how可以设为下列值:

  ·0-------不允许继续接收数据

  ·1-------不允许继续发送数据

  ·2-------不允许继续发送和接收数据,均为允许则调用close ()

  shutdown在操作成功时返回0,在出现错误时返回-1(并置相应errno)。

  12. gethostbyname:

  域名和IP地址的转换

  struct hostent *gethostbyname(const char *name);

  13.inet_pton函数:

  将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。

  int inet_pton(int family,const char * strptr,void * addrptr);

  第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向点分十进制串的指针:第三个参数是一个指向转换后的网络字节序的二进制值的指针。

  返回:1---成功   0---输入不是有效的表达格式   -1---失败

  14.inet_ntop函数:

  和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。

  const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len);

  第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。

  返回:指向结果的指针---成功   NULL---失败

时间: 2024-10-13 20:09:55

TCP编程函数和步骤详解的相关文章

php5.3.10的安装配置步骤详解

在linux中php安装配置与windows中有不小的区别了,在linux中几乎都是代码形式了,下面我们一起来看看php5.3.10的安装配置步骤详解,希望下文可帮助到各位. 下面以最新的php-5.3.10为例进行安装. wget http://cn.php.net/distributions/php-5.3.10.tar.gz tar -zxvf php-5.3.10.tar.gz cd php-5.3.10 ./configure --prefix=/usr/local/php --wit

jquery高级编程的最佳实践详解

 这篇文章主要介绍了jquery高级编程的最佳实践详解,学习JQ的朋友一定需要这个,参考下吧 加载jQuery   1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址.    代码如下: <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.mi

115网盘怎么用 115网盘下载方法步骤详解

  115网盘怎么用呢?115网盘是大家都很喜欢使用的网络硬盘.下面,绿茶小乐哥就为大家带来115网盘下载方法步骤详解,感兴趣的就一起来看下吧. 115网盘是什么? 115网盘是目前流行的网络硬盘,和它属于同一类的还有百度云.360云盘和腾讯微云等,曾几何时人们主要是通过U盘转移数据,现在随着网盘兴起,大部分人都采用网盘存储数据.同传统硬盘和U盘相比,安全,便捷和免费是网盘的杀手锏特色.115网盘凭借出色的使用体验.高容量存储(2TB).丰富的功能.海量的资源和对所有主流离线下载方式的支持(你懂

mysql免安装版配置步骤详解

 这篇文章主要介绍了mysql免安装版配置步骤详解,提供了二个网友的安装方法,大家可以参考使用 1.准备工作   下载mysql的最新免安装版本mysql-noinstall-5.1.53-win32.zip,解压缩到相关目录,如:d: mysql-noinstall-5.1.53-win32.这个就是mysql的根目录了.   2.配置   在根目录下有几个文件如下:   my-small.ini (这是针对一个小内存(〈= 64MB)的系统,MySQL 只会被时不时地用一下,很重要的是 my

在docker中部署tomcat并且部署java应用程序的步骤详解_docker

先给大家简单说下Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 1.先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7,并且切换到该目录下:cd tomcat7: 第二步:创建Dockerfile,命令如:touch Docker

installshield-installsheild 2008中的release Wizard步骤详解

问题描述 installsheild 2008中的release Wizard步骤详解 本人IT小白,最近在制作安装包,在installshield 2008中用Release Wizard生成exe这步有点困难, 还希望专业大牛分享一下关于这部分的操作详解..拜托了!! 解决方案 http://chorfung.blog.163.com/blog/static/1207120002010320104717707/

javascript 用函数实现继承详解_javascript技巧

一.知识储备: 1.枚举属性名称的函数: (1)for...in:可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性) (2)Object.keys():返回数组(可枚举的自有属性) (3)Object.getOwnPropertyNames():所有的自有属性 3.属性的特性:数据属性和存取器属性 (1)数据属性:可写(writable)  可枚举(enumerable)  可配置(configurable)  值(value) 数据属性只有一个简单的值: (2)存取器属性: 写

javascript设计模式之对象工厂函数与构造函数详解_基础知识

下面通过文字详解加代码分析的方式给大家分享下javascript设计模式之对象工厂函数与构造函数的相关知识. 概述使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法.然而,除了这两种常用的对象创建方式,JavaScript还提供了其他方法创建对象.1).使用工厂函数创建对象我们可以编写一个函数,此函数的功能就是创建对象,可将其. 概述 使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法. 然而,除了这两种常用的对象创建方式,JavaScript还提

Java并发编程总结——慎用CAS详解_java

一.CAS和synchronized适用场景 1.对于资源竞争较少的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源:而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能. 2.对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized.以java.util.concurrent.atomic包中AtomicInteger类为例,其getAn