计算机网络学习socket--day2
1.TCP客户/服务器模型(C/S)
2.回射客户/服务器模型
3.socket、bind、listen、accept、connect
	||--------------------------------------------------------------
	socket函数
	包含头文件<sys/socket.h>
	功能:创建一个套接字用于通信
	原型:
		int socket(int domain,int type,int protocol);
	参数:
		domain:指定通信协议族(protocol family)
		type:指定socket类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM原始套接字SOCK_RAW
		protocol:协议类型
	返回值:
		成功返回非负整数,它与文件描述符类似,我们把它称为套接口描述字,简称套接字。失败返回-1。
man socket 查看帮助
||---------------------------------------------------------------
	bind函数
	包含头文件<sys/socket.h>
	功能:绑定一个本地地址到套接字
	原型:
		int bind(int socket,const struct sockaddr *addr,socklen_t addrlen);
	参数:
		sockfd:socket函数返回的套接字
		addr:要绑定的地址
		addrlen:地址长度
	返回值:成功返回0,失败返回-1
||---------------------------------------------------------------
	listen函数
	包含头文件<sys/socket.h>
	功能:将套接字用于监听进入的连接
	原型:
		int listen(int sockfd,int backlog);
	参数:
		sockfd:socket函数返回的套接字
		backlog:规定内核为此套接字排队的最大连接个数
	返回值:成功返回0,失败返回-1
	****
		1.一般来说,listen函数应该在调用socket和bind函数之后,调用函数accept之前调用。
		2.对于给定的监听套接口,内核要维护两个队列
			1》已有客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程
			2》已完成连接的队列
	||---------------------------------------------------------------
	accept函数
	man 2 accept
	包含头文件<sys/socket.h>
	功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞。
	原型:
		int accept(int sockfd,struct sockaddr *addr, socklen_t *addrlen);
	参数:
		sockfd:服务器套接字
		addr:将返回对等方的套接字地址
		addrlen:返回对等方的套接字地址长度
	返回值:成功返回非负整数,失败返回-1
	||---------------------------------------------------------------
	被动套接字
		用来接收连接的, accept
	主动套接字
		用来发起连接的,connet
	||---------------------------------------------------------------
	connect函数
	包含头文件<sys/socket.h>
	功能:建立一个连接至addr所指定的套接字
	原型:
		int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
	参数:
		sockfd:未连接套接字
		addr:要连接的套接字地址
		addrlen:第二个参数addr长度
	返回值:成功返回0,失败返回-1
	||---------------------------------------------------------------
实现一个回射服务器,客服端不断从标准输入获取一行数据发送给服务器端,服务器端接收并且把它回射回去
#include<unistd.h>
	#include<sys/types.h>
	#include<sys/socket.h>
	#include<netinet.in.h>
	#include<arpa/inet.h>
	#include<stdlib.h>
	#include<stdio.h>
	#include<errno.h>
	#include<string.h>
#define ERR_EXIT(m)
		do
		{
			perror(m);
			exit(EXIT_FAILURE);
		}while(0)
int main(void)
	{
		int listenfd;
		if((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
		/*同上一样表示listenfd = socket(PF_INET, SOCK_STREAM, 0);*/
			ERR_EXIT("socket");
		/*55-61地址的初始化*/
		struct sockaddr_in servaddr;
		memset(&servaddr,0,sizeof(servaddr));
		servaddr.sin_family = AF_INET;
		servaddr.sin_port = htons(5188);
		servaddr.sin_addr.s_addr = htonl(INADDR_ANY);	
		/*servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");*/
		/*inet_aton("127.0.0.1",&servaddr.sin_addr);*/
//绑定
		if (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))) < 0
			ERR_EXIT("bind");				//绑定失败
		//监听   查看man 2 listen
		if(listen(listenfd, SOMAXCONM) < 0)
			ERR_EXIT("listen");
		//接受
		struct sockaddr_in peeraddr;
		socklen_t peerlen = sizeof(peeraddr); //peerlen必须有初始值	
		int coon;			//成为主动套接字在下面的if后
		if((coon = accept(listen,(struct sockaddr*)&peeraddr,&peerlen)) < 0)
			ERR_EXIT("accept");
char recvbuf[1024];
		while(1)
		{
			memset(recvbuf, 0, sizeof(recvbuf));
			int ret = read(conn, recvbuf, sizeof(recvbuf));
			fputs(recvbuf, stdout);
			write(conn, recvbuf,ret);
			//write(conn, recvbuf,strlen(recvbuf))
}
close(conn);
		close(listenfd);
		return 0;
	}
实现一个回射客户端
#include<unistd.h>
	#include<sys/types.h>
	#include<sys/socket.h>
	#include<netinet.in.h>
	#include<arpa/inet.h>
	#include<stdlib.h>
	#include<stdio.h>
	#include<errno.h>
	#include<string.h>
#define ERR_EXIT(m)
		do
		{
			perror(m);
			exit(EXIT_FAILURE);
		}while(0)
int main(void)
	{
		int sock;
		if((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
			ERR_EXIT("socket");
		struct sockaddr_in servaddr;
		memset(&servaddr,0,sizeof(servaddr));
		servaddr.sin_family = AF_INET;
		servaddr.sin_port = htons(5188);
		servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(sock,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)
			ERR_EXIT("connect");
		char sendbuf[1024] = {0};
		char recvbuf[1024] = {0};
		while(fgets(sendbuf,sizeof(sendbuf),stdin) != NULL)
		{
			write(sock,sendbuf,strlen(sendbuf));
			read(sock,recvbuf,sizeof(recvbuf));
fputs(recvbuf,stdout);
			memset(sendbuf,0,sizeof(sendbuf));
			memset(recvbuf,0,sizeof(recvbuf));
		}
close(sock);//关闭套接口
return 0;
	}
计算机网络学习socket--day2的更多相关文章
- 【总结】学习Socket编写的聊天室小程序
		1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ... 
- Spark菜鸟学习营Day2 分布式系统需求分析
		Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ... 
- python学习------socket编程
		一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ... 
- Python学习日记 --day2
		Python学习日记 --day2 1.格式化输出:% s d (%为占位符 s为字符串类型 d为数字类型) name = input('请输入姓名') age = int(input('请输入年龄 ... 
- 在Android手机上学习socket程序
		我们都知道Android手机是基于Linux系统的,在没有Linux环境,但是想学习socket编程的同学可以在Android手机中试试,利用ndk编译可执行文件在Android手机中运行.不同于动态 ... 
- [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select
		以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ... 
- python学习(day2)
		1.常用数据类型及内置方法 1.列表(list) 定义:在中括号[]内存放任意多个值,用逗号隔开. 具体函数和内置方法如下: #定义学生列表,可存放多个学生 students=['a','b','c' ... 
- 深入学习socket网络编程,以java语言为例
		了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ... 
- 计算机网络学习笔记NO.2 物理层
		2.1 基本概念 2.1.1 物理层概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体. 物理层主要任务:确定与传输媒体接口有关的一些特性(定义标准) 机械特性:定 ... 
- MFC学习 socket
		下面未处理异常 tcpserver.cpp #include "WinSock2.h" #include <stdio.h> #pragma comment(lib, ... 
随机推荐
- usb串口的作用以及JLINK
			usb串口的作用 (1)可以当串口使用 (2)如果usb串口连接到STM32的串口1(stm32ISP下载只能是串口1),可以用串口下载程序 (3)因为要连接到usb,可以用来供电 JLINK JLI ... 
- 测试必备工具之最强抓包神器 Charles,你会了么?
			前言  作为软件测试工程师,大家在工作中肯定经常会用到各种抓包工具来辅助测试,比如浏览器自带的抓包工具-F12,方便又快捷:比如时下特别流行的Fiddler工具,使用各种web和APP测试的各种场景 ... 
- Beta冲刺<4/10>
			这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第四天(05.22) 作业正文 如下 其他参考文献 ... B ... 
- cbitmap 获取RGB
			CBitMap的用法 MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建.图像数据的获取等功能.虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以 ... 
- 在web开发中,为什么前端比后端更得到转行程序员的青睐?必看!
			1.Web开发分类与区别 人们通常将Web分为前端和后端,前端相关的职位有前端设计师(UI/UE),前端开发工程师,后端相关的有后端开发工程师. 2.技术栈区别 看各大招聘网站上,公司对前端开发工程师 ... 
- 【秒懂Java】【02_搭建开发环境】01_Java开发必备
			这篇文章主要讲解:要想使用Java来开发软件,需要做哪些准备工作? 配置电脑 作为一名开发人员,对文件的类型.大小等信息是比较敏感的,所以建议你的电脑做2个配置: 显示文件扩展名 文件扩展名(File ... 
- EOS基础全家桶(十四)智能合约进阶
			简介 通过上一期的学习,大家应该能写一些简单的功能了,但是在实际生产中的功能需求往往要复杂很多,今天我就继续和大家分享下智能合约中的一些高级用法和功能. 使用docker编译 如果你需要使用不同版本的 ... 
- 基于4G Cat.1的内网穿透实例分享
			上一篇分享了:小熊派4G开发板初体验 这一篇继续BearPi-4G开发板实践:内网穿透实验. 基本TCP的socket通信测试 之前我们学习WiFi模块时,与PC进行TCP协议的socket通信测试我 ... 
- Netty 源码解析(五): Netty 的线程池分析
			今天是猿灯塔“365篇原创计划”第五篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty ... 
- 「从零单排canal 04」 启动模块deployer源码解析
			基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ... 
