Linux C网络编程学习笔记
Linux C网络编程总结报告
一.Linux C 网络编程知识介绍:
网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端.
客户端:(client)
在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程 序。比如我们使用ftp程序从另外一个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件),所以这个地方我们的ftp程序就是客户端程序。
服务端:(server)
和客户端相对应的程序即为服务端程序。被动的等待外面的程序来和自己通讯的程序称为服务端程序。
比如上面的文件获取中,另外一个地方的程序就是服务端,我们从服务端获取文件过来。
互为客户和服务端
实际生活中有些程序是互为服务和客户端。在这种情况项目,一个程序既为客户端也是服务端。
TCP/UDP介绍
TCP(Transfer Control Protocol)传输控制协议是一种面向连接的协议, 当我们的网络程序使用这个协议的时候,网络可以保证我们的客户端和服务端的连接是可靠的,安全的.
UDP(User Datagram Protocol)用户数据报协议是一种非面向连接的协议, 这种协议并不能保证我们的网络程序的连接是可靠的,所以我们现在编写的程序一般是采用TCP协议的.
二.Socket编程-初等网络函数总结(TCP)
Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用,会返回一个通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的好处. 我们可以通过向描述符读写操作实现网络之间的数据交流.
1.建立socket套接字(调用socket函数来创建一个能够进行网络通信的套接字)
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
参数domain指定通信协议簇,对于TCP/IP协议簇使用AF_INET.
参数 type 表示套接字类型 流类型SOCKET_STREAM(TCP) 数据报类型SOCKET_DGRAM(UDP)
原始套接字 SOCKET_RAW
创建示例:
struct protoent *ppe
ppe=getprotobyname("tcp");
int socketfd=socket(AF_INET,SOCKET_STREAM,ppe->p_proto);
2.使用bind()函数将一本地地址与一套接口捆绑
当用socket创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
#include<...省略>
int bind(int socketfd, struct sockaddr* myaddr, socklen_t addrlen)
参数一:建立的socket描述字
参数二:指向sockaddr结构体类型的指针
参数三:sockaddr的长度可使用sizeof(struct sockaddr)
绑定示例:
struct sockaddr_in my_addr;
int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建基于流套接字
my_addr.sin_family = AF_INET;//IPv4协议族
my_addr.sin_port = htons(port);//端口转换
my_addr.sin_addr.s_addr = INADDR_ANY;// 表示服务器可以接收任意设备连接
bzero(&(my_addr.sin_zero),0);//初始化
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(myaddr)) == -1)
{
perror("bind");
exit(1);
}
3.Listen()监听函数
作用:将一个套接字转换为倾听套接字(Listening socket).
int listen(int sockfd,int backlog);
sockfd:是bind后的文件描述符.
backlog:设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度.
listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样.
函数socket创建的套接字是主动的套接字,可以用它来进行主动连接(用connect())但是不能接收请求...
服务器的套接字必须要被动接收来自客户机的请求,函数listen告诉TCP协议这个套接字可以接收连接请求
4.accept()函数
函数accept从倾听套接字中接收一个连接.如果完成连接队列为空,那么这个进程睡眠
int accept(int sockfd,struct sockaddr *addr ,int *addrlen);
返回一个新的套接字描述符.
示例:
if((clientfd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)) == -1)
//接收客户端连接
{
perror("accept");
exit(1);
}
5.connect()
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);
/*sockfd:socket返回的文件描述符.
serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址
addrlen:serv_addr的长度 */
用服务器端地址端口填充好serv_addr
connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符失败时返回-1.
6.close(sockfd);
7.read write
函数read write从套接字读和写数据.定义如下:
int read(int fd,char *buf,int len);
int write(int fd,char *buf,int len);
Linux C网络编程学习笔记的更多相关文章
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...
- 网络编程学习笔记:Socket编程
文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...
- 网络编程学习笔记一:Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- LInux下socket编程学习笔记
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- Java Socket网络编程学习笔记(一)
0.前言 其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章, 是传统IO(BIO)相关的内容,故在此 ...
- Java网络编程学习笔记
Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...
- JAVA UDP网络编程学习笔记
一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...
随机推荐
- Oracle 11g新特性虚拟列分区
如今有个需求:一个单据表要依照月份来分区.假设是在Oracle 10g上,仅仅能再加一个字段. 在Oracle 11g以后就不一样了.能够用虚拟列处理. SQL> select * from v ...
- poj2388 高速排序 模板题
/** \brief poj2388 * * \param date 2014/8/5 * \param state AC * \return memory time * qsort 784K 110 ...
- 从零开始学习UNITY3D(GUI篇 GUI.Window)
unity3d里面,也是包含window窗体的,下面看一下GUI.Window方法的详情 下面我们用代码实现一个通过开关显示窗体的隐藏和显示的功能,代码如下: public class windows ...
- 将图片文件以byte的形式从导数据库中
byte[] FileByteArray = new byte[FileLength]; //图象文件临时储存Byte数组 //Stream StreamObject ...
- CSS用法简介
CSS(Cascading Style Sheets层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. 1.基本使用语法 ...
- Sql Sever 字符串截取汉字
最近需要在SQL的字符串中截取汉字,利用unicode函数判断字符的unicode编码,根据编码范围过滤掉非汉字字符. 写成了一个function /*@str 需要获取汉字的字符串*/ create ...
- 从 NSURLConnection 到 NSURLSession
iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...
- js简单实现链式调用
链式调用实现原理:对象中的方法执行后返回对象自身即可以实现链式操作.说白了就是每一次调用方法返回的是同一个对象才可以链式调用. js简单实现链式调用demo Object.prototype.show ...
- 5.7.2.4 random() 方法
Math.random()方法返回大于等于0小于1的一个随机数.对于某些站点来说,这个方法非常实用,因为可以利用它来随机显示一些名人名言和新闻事件.套用下面的公式,就可以利用Math.random() ...
- 做了一个图片等比缩放的js
做了一个图片等比缩放的js 芋头 发布在view:8447 今天改了一下博客的主题,发现博客主题在ie6下变样了,后来发现是因为某篇文章里的某个图片太大了撑开了容器,导致样式错位,前几天公司需求里 ...