TCP与UDP通信流程

TCP通信的基本步骤如下:

服务端:socket---bind---listen---while(1){---accept---recv---send---close---}------close

客户端:socket------------------------------connect---send---recv-----------------close

UDP通信的基本步骤如下:

服务端:socket---bind---recvfrom---sendto----close

客户端:socket----------sendto----recvfrom---close

函数原型

TCP

TCP

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h> server: int socket(int domain, int type, int protocol); int bind(int fd_server, struct sockaddr *addr_server, int addrlen); /* 绑定服务器联系方式,让客户端有明确的联系方式可以连接 */ int listen(int fd_server, int backlog); /* 将fd_server转换为被动套接字,同时内核将listen到的请求的联系方式放入队列 */ int accept(int fd_server, struct sockaddr *addr_client, int *addrlen); /* 返回客户端socket的另一端,以此建立连线 *//* addr_client为传出参数,存放请求连接方的联系方式 ,如不需要刻意置为NULL */ client: int connect (int fd_client,struct sockaddr *addr_server, int addrlen); /* 通过服务器的联系方式addr_server去连接服务器 */ /* 作为服务器,一定要绑定联系方式,不然请求方没有明确的联系方式可以连接 ,
作为客户端,可以不用绑定联系方式,其端口号会由系统自动分配。
建立连线的关键在于accept函数会返回客户端socket描述符所对应的另一端socket的描述符,
并且客户端的联系方式也可以在accept中使用传出函数获取。 */ after connect: /* 建立连线后,就可以利用socket描述符发送接收信息了 */
int recv(int sockfd,void *buf,int len,unsigned int flags);
int send(int s,const void * msg,int len,unsigned int flags);
/* 会话结束,关闭 */
int close(int fd);

UDP

UDP

server:

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

/* 绑定服务器联系方式,让客户端有明确的联系方式可以连接 */
int bind(int fd_server, struct sockaddr *addr_server, int addrlen); /* 由于fd_server已经绑定联系方式(addr_server),请求方发送信息时,会通过addr_server发送消息至服务器fd_server,
因此,服务器可以通过fd_server收到消息,并且请求方的联系方式可以通过传出参数addr_client获取 */
int recvfrom(int fd_server, void *buf, int len, unsigned int flags, struct sockaddr *addr_client, int *addrlen); /* 请求方的联系方式(addr_client)会由系统自己绑定,服务器是通过recvfrom的传出参数获取addr_client的。
因此服务器发送消息时,可以通过客户端联系方式addr_client发送至客户端fd_client。 */
int sendto(int fd_server, const void *msg, int len, unsigned int flags, const struct sockaddr *addr_client, int addrlen); client: /* 客户端的联系方式,服务器可以在recvfrom时获取,因此没有必要在一开始就绑定 */
int sendto(int fd_server, const void *msg, int len, unsigned int flags, const struct sockaddr *addr_client, int addrlen); int recvfrom(int fd_server, void *buf, int len, unsigned int flags, struct sockaddr *addr_client, int *addrlen); /* 实际上,UTP通信方式并没有建立socket连线,双方均是通过联系方式(IP和端口号)进行通信的。
服务器需要在一开始绑定联系方式,不然请求方没有明确的联系方式可以连接。
当服务器recvfrom,不但可以收到客户端的消息,同时可以获取客户端的联系方式。 */

总结

1. TCP通信会建立连线。服务器的socket端口会bind联系方式,给客户端一个明确的联系方式去connect。服务器会listen到客户端的connect,并将其联系方式放入内核维护的任务请求队列中。之后服务器accept,获取与客户端通信的对应socket端口,从而建立连线!之后双方通过socket端口进行通信。

2. UDP通信不会建立连线。服务器的socket端口同样会bind联系方式。客户端通过此联系方式向服务器发送(sendto)消息,由于此联系方式已绑定到服务器的socket端口,因此服务器一定可以收到(recvfrom)消息,与此同时通过recvfrom的传出参数获取客户端的联系方式,从而可以通过客户端的联系方式向客户端发送消息。即,UTP的通信是基于联系方式(IP和端口号)的。是不可靠的通信方式。

3. 为什么TCP中的accept与UDP中的recvfrom都可以通过传出参数获取对方联系方式?不理解的话,可以类比寄信,别人给你寄一封信时,总会写上自己的联系方式吧。

Linux网络编程4——个人总结的更多相关文章

  1. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"

    [深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...

  2. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

  3. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  4. linux网络编程 no route to host 解决方案

    linux网络编程 no route to host 解决方案 [整合资料] (2013-05-13 21:38:12) 转载▼ 标签: net iptables it 分类: Linux 参考资料h ...

  5. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  6. Linux网络编程&内核学习

    c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...

  7. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  8. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  9. Linux网络编程必看书籍推荐

    首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...

  10. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

随机推荐

  1. android开发系列之socket编程

    上周在项目遇到一个接口需求就是通讯系列必须是socket,所以在这篇博客里面我想谈谈自己在socket编程的时候遇到的一些问题. 其实在android里面实现一个socket通讯是非常简单的,我们只需 ...

  2. UITextField 属性详解

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  3. Nginx + django windows下配置

    1.下载nginx, 去http://nginx.org/en/download.html 下载,我下载的是1.8 stable版本. 2.配置文件/conf/nginx.conf #user nob ...

  4. 37.altium designer中的class和rules?

    在布局布线工程中,遇到复杂工程时,难免要进行class和rules的设置,经过试验证明,class和rules的子目录是有优先级的.

  5. vi/vim编辑器

    vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大.

  6. 状压DP

    今天稍微看了下状压DP,大概就是这样子的,最主要的就是位运算, i and (1<<k)=0 意味着i状态下没有 k : i and (1<<k)>0 意味着i状态下有 ...

  7. linux查看tomcat版本

    进入tomcat bin目录下 然后执行 ./version.sh Server version: Apache Tomcat/6.0.26Server built:   March 9 2010 1 ...

  8. 集成Spring后HibernateTemplate实现分页

    spring 整合 hibernate 时候用的 HibernateTemplate 不支持分页,因此需要自己包装一个类进行分页,具体实现如下...使用spring的hibernateTemplate ...

  9. PostgreSQL中的引号和null

    今天工作时写了一个sql,但是PostgreSQL总是提示有语法错误,简单的做个记录:  问题1.'' 和“”单引号和双引号         举个例子: #.select id, delivery_d ...

  10. C#委托详解(1):什么是委托

    本系列文章将详细探讨C#中的委托,列举其主要的实现方式,并分析其在设计层面和编码层面带来的好处,最后会讨论其安全性和执行效率等. 什么是委托? 委托是寻址方法的.NET版本,使用委托可以将方法作为参数 ...