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网络编程学习笔记的更多相关文章

  1. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  2. Linux C++ 网络编程学习系列(1)——端口复用实现

    Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...

  3. 网络编程学习笔记:Socket编程

    文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...

  4. 网络编程学习笔记一:Socket编程

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  5. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  6. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  7. Java Socket网络编程学习笔记(一)

    0.前言 其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章, 是传统IO(BIO)相关的内容,故在此 ...

  8. Java网络编程学习笔记

    Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...

  9. JAVA UDP网络编程学习笔记

    一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...

随机推荐

  1. frameset常用属性

    框架是网页画面分成几个框窗(不同的窗口对应不同页面以几个网页的形式显示),同时取得多个 src的地址.页面所有框架标记需要放在一个总起的 html 档,这个档案只记录了该框架如何分割 ,不会显示任何资 ...

  2. UVa 10491 Cows and Cars (概率&广义三门问题 )

    10491 - Cows and Cars Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onli ...

  3. asp.net 使用my97 datepicker实现前后两个日期的范围界定

    说明:日期选择后,前面的日期小于等后面的日期,后面的日期大于等于前面的日期.点点看就知道了:) - 这里将周末日期不可选.代码如下: <html xmlns="http://www.w ...

  4. How To Set Dark Theme in Visual Studio 2010

    Want to use the visual studio color theme editor to set the dark theme or other themes? Below shows ...

  5. SQL练习之不破坏应用程序现有查询的修改模式

    当我还是一个菜鸟的时候,当然现在也是,当我的软件需求发生变化时,并且数据库设计同样要求发生变化,我通常会放弃原有的代码(或者对原有的代码进行大改),先在我知道了两个不破坏应用程序现有查询的修改模式,下 ...

  6. JavaSE思维导图(八)

  7. Win8.1重装win7或win10中途无法安装

    一.有的是usb识别不了,因为新的机器可能都是USB3.0的,安装盘是Usb2.0的. F12更改系统BIOS设置,我改了三个地方: 1.设置启动顺序为U盘启动 2.关闭了USB3.0 control ...

  8. sql中复合组建解析

    每个表只能有一个主键 唯一键/约束可以多个 复合主键是指复合唯一,比如: 1 1 1 2 2 1 2 2 单看任何一列都不是唯一,但组合起来就是唯一的. Create Table 表名 (字段名1 I ...

  9. ASP.NET MVC Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

  10. mysql errno:13

    新装的mysql,创建表时报错误 errno:13,网上查了一下是权限问题.解决方式如下: 到mysql的数据目录下:即启动进程中:--datadir=/data/soft/mysql/mysqlda ...