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是对应的 ...
随机推荐
- lucene3.6笔记添加搜索功能
lucene为程序添加搜索功能,此功能基于已创建好的文档的索引之上.这里我已经为一些文档建立了索引,并保存到硬盘上.下面开始针对这些索引,添加搜索功能. 1.简单的TermQuery搜索 Java代码 ...
- css3幻灯片换位效果
<title>css3幻灯片换位效果</title> <style type="text/css"> .flowGallery {width: ...
- OracleOraDb10g_home1TNSListener服务无法启动
启动OracleOraDb10g_home1TNSListener服务的时候就报错:“Windows无法启动OrcleOraDb11g_home1TNSListener服务(位于本地计算机上). 错误 ...
- 从零开始学习UNITY3D(GUI篇 群组视图控件)
控件组可以看成一个大的容器,控件组里面的控件,相对位置已该控件组为基准,而不再已屏幕左上角为基准. 下面来看一下代码实例及其效果截图: public class GUI2 : MonoBehaviou ...
- samba服务器的安装及配置
安装前首先查看服务器是否已经安装samba服务器 [root@bogon home]# rpm -qa|grep samba system-config-samba-docs-1.0.9-1.el6. ...
- Qt(QML)本地化
Internationalization and Localization with Qt Quick 程序国际化 1) Use qsTr() for all Literial UI strings ...
- windows8 安装IIS 和 添加网站(转)
Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...
- JavaScript中的闭包理解
原创文章,转载请注明:JavaScript中的闭包理解 By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...
- 新视野OJ 2705 [SDOI2012]Longge的问题 (数论)
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2705 题解:求 sigma(gcd(i,n), 1<=i<=n<2^32) ...
- JavaScript最全的10种跨域共享的方法
在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和 ...