【C++】 网络编程 01
趁着计算机网络这门课布置了课程设计,学习下网络编程。
系统:Ubuntu 14.01...
1. 关于Socket(套接字)
1.1
套接字是存在于运输层和应用层间的抽象层,通过它来区分不同应用程序进程间的网络通信和连接。
其主要包含3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。
1.2
套接字的通信流程:
1.3
socket()函数:
int socket(int domain, int type, int protocol);
其中:
- domain为创建的套接字指定协议集。
- AF_INET 表示IPv4网络协议
- AF_INET6 表示IPv6网络协议
- AF_UNIX 表示本地套接字
- type 如下:
SOCK_STREAM
(可靠的面向流服务或流套接字)SOCK_DGRAM
(数据报文服务或者数据报文套接字)SOCK_SEQPACKET
(可靠的连续数据包服务)SOCK_RAW
(在网络层之上的原始协议)
- protocol 指定实际使用的传输协议。 如果该项为“
0
”的话,即根据选定的domain和type选择使用缺省协议。(目前也只遇到了0)
connection()函数:
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
- socket即socket()函数返回值
- myaddr 表示指向sockaddr结构(用于表示所分配地址)的指针
- addrlen表示sockaddr结构的长度
当返回值为-1,表示出错;返回0表示连接成功。
先编写客户端程序client.cpp,创建一个套接字:
#include<iostream>
#include<sys/socket.h>
using namespace std; int main()
{
int socket_desc;
socket_desc = socket(AF_INET , SOCK_STREAM , ); if (socket_desc == -)
{
cout<<("Could not create socket");
} return ;
}
1.4
接下来将这个套接字连接到Server上,需要ip地址和端口号
使用sockaddr_in对需要连接到的服务器进行设定,sockaddr_in和sockaddr结构:
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[]; // zero this if you want to
}; struct in_addr {
unsigned long s_addr; // load with inet_pton()
}; struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[]; // 14 bytes of protocol address
};
尝试连接到baidu.com的服务器,ip:14.215.177.37,ip地址是256进制的4字节数据,如14.215.177.37(baidu.com),用inet_addr函数将它转化成长整数类型:
server.sin_addr.s_addr = inet_addr("14.215.177.37");
向上述代码添加sockaddr_in结构体对象server:
#include<iostream>
#include<sys/socket.h>
#include<arpa/inet.h> using namespace std; int main()
{
int socket_desc;
struct sockaddr_in server;
//create socket
socket_desc = socket(AF_INET, SOCK_STREAM, );
if(socket_desc == -)
{
cout<<"Could not creat socket"<<endl;
} server.sin_addr.s_addr = inet_addr("14.215.177.37");
server.sin_family = AF_INET;
server.sin_port = htons(); //connect to remote server
if(connect(socket_desc, (struct sockaddr*)&server, sizeof(server))<)
{
cout<<("connect error")<<endl;
return ;
} cout<<("Connected")<<endl; return ;
}
如果无误,运行后控制台会显示"Connected",连接成功
tips:Connections are present only in tcp sockets
1.5
用send()函数实现通过Socket发送数据
send()函数:
int send(int socket, const void * buff, int length, int flags);
recv()函数:
int recv(int socket, void *buff, int length, int flags);
- *buff是指向待传输数据buffer的指针
- length是待传输数据的长度
- flags标志调用方式,一般置0(?)
向baidu的服务器发送请求并获取回复:
#include<iostream>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h> using namespace std; int main()
{
int socket_desc;
struct sockaddr_in server;
char *msg, server_reply[]; //create socket
socket_desc = socket(AF_INET, SOCK_STREAM, );
if(socket_desc == -)
{
cout<<"Could not creat socket"<<endl;
} server.sin_addr.s_addr = inet_addr("64.233.187.105");
server.sin_family = AF_INET;
server.sin_port = htons(); //connect to remote server
if(connect(socket_desc, (struct sockaddr*)&server, sizeof(server))<)
{
cout<<("connect error")<<endl;
return ;
} cout<<("Connected")<<endl; //send data
msg = "GET / HTTP/1.1\r\n\r\n"; // HTTP Request
if(send(socket_desc, msg, strlen(msg), )<)
{
cout<<"Send failed"<<endl;
return ;
}
cout<<"Data send\n"<<endl; //Recieve a reply from the server
if(recv(socket_desc, server_reply, , )<)
{
cout<<"Recv failed"<<endl;
}
cout<<"Reply revieved\n"<<endl;
cout<<server_reply<<endl; return ;
}
其中 "GET / HTTP/1.1" 是HTTP请求...具体什么意思暂时并不明白,但可以验证发送成功
返回如下信息:
Connected
Data send Reply revieved HTTP/1.1 Moved Temporarily
Date: Fri, Jun :: GMT
Content-Type: text/html
Content-Length:
Connection: Keep-Alive
Location: http://www.baidu.com/search/error.html
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=
BDPAGETYPE:
Set-Cookie: BDSVRTM=; path=/
1.6
最后关闭socket,用unistd.h中的close()函数:
close(socket_desc);
1.7
以上完成了三个基本操作:
- 创建套接字
- 建立与服务器的连接
- 发送和接收信息
【Over】
【C++】 网络编程 01的更多相关文章
- 网络编程01 · 艺
Web Socket和Socket 套接字,实际就是传输层的接口.用于抽象传输层,隐藏细节.一对套接字可以进行通信. Web Socket,是基于TCP协议的.类似于,http. 为什么需要Web S ...
- python网络编程01 /C/S架构|B/S架构、网络通信原理、五层协议、七层协议简述、端口映射技术
python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述.端口映射技术 目录 python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述. ...
- python网络编程-01
python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...
- 从零探索Java网络编程01之 TCP/IP 与 Socket
最近完成了几项比较简单的项目, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧? 一个普通的控制台日志映入了我的眼帘(孽缘呀): (图中使用 SpringBoot 的 log4j 来输出日志 ...
- python网络编程01
1.什么是C/S架构? 客户端/服务器架构.实现服务端软件与客户端软件基于网络的通信. 2.互联网协议是什么?分别介绍五层协议中每一层的功能? 互联网协议是指用于互联网通信的规范.分为:osi七层.t ...
- 【网络编程01】socket的基础知识-简单网络通信程序
1.什么是socket socket(套接字),简单来说是IP地址与端口(port)的组合,可以与远程主机的应用程序进行通信.通过IP地址可以确定一台主机,而通过端口则可以确定某一个应用程序.IP+端 ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- day39-网络编程01
Java网络编程01 1.网络相关的概念 1.1网络通信和网络 网络通信 概念:两台设备之间通过网络实现数据传输 网络通信:将数据通过网络从一台设备传输到另一台设备 java.net包下提供了一系列的 ...
- 01网络编程(基础知识+OSI七层协议+TCP与UDP)
目录 01 网络编程 一.软件开发架构 1.1 CS架构 1.2 BS架构 二.网络理论前戏 2.1 简介 2.2 常见硬件 三.OSI七层协议(五层) 3.1 七层协议 3.2 五层协议 3.3 知 ...
随机推荐
- LOJ#6284. 数列分块入门 8
分块的时候开一个数组标记这个区间是不是都是一样颜色的部分,如果是的话,我后面的查询,更新部分就可以直接整块操作,对于不是不全部都一样颜色的块在具体进到快里面去暴力. 在更新的时候对边上的两个不完整的块 ...
- centos7添加并挂载新硬盘
环境目标: 配置一台centos7,主硬盘40G装系统:副硬盘200G作为数据盘(格式:XFS)挂载到根目录:/data/ 说明:XFS是高性能文件系统,SGI为他们的 IRIX平台而设计: 自从20 ...
- Python使用import导入相对路径的其他py文件
假如有如下的目录结构 . ├── setup.py ├── main.py ├── mod/ │ └── mod.py └── sub/ └── sub.py 情况1:setup.py导入main ...
- MSXML2.ServerXMLHTTP responseText 获取的内容不完整,解决方案
今天无意发现一个问题, 有个别几个网页使用 MSXML2.ServerXMLHTTP 获取网页源代码的时候,.responseText 总是返回一部分内容,无法获取完整的内容. 经过搜索,找到解决方案 ...
- Vue中data返回对象和返回值的区别
速记:粗浅的理解是,事件的结果是影响单个组件还是多个组件.因为大部分组件是要共享的,但他们的data是私有的,所以每个组件都要return一个新的data对象 返回对象的时候 <!DOCTYPE ...
- 第八节,配置分布式TensorFlow
由于随着神经网络层数的增多,需要训练的参数也会增多,随之而来需要的数据集就会很大,这样会造成需要更大的运算资源,而且还要消耗很长的运算时间.TensorFlow提供了一个可以分布式部署的模式,将一个训 ...
- java 中,new一个新对象时,是先给成员变量赋上初值后 再来调用类中的构造函数的。
今天学习时法现一个问题,我们定义了一个Test类,在主类中new了一个他的对象,发现:在新建对象中所有的成员变量是先给定了默认初值的:0,null或者false, 之后再调用的构造函数.(如果变量是由 ...
- js怎么获取微信浏览器内容的高度
通过window对象来得到窗口相关的内外款高度信息,如下: outerHeight属性设置或返回一个窗口的外部高度,包括所有界面元素(如工具栏/滚动条).outerWidth属性设置或返回窗口的外部宽 ...
- 关于code::blocks的编译速度问题
在一个程序写好之后,按下F9,便可以进行编译并且运行,在2018年的寒假之中,编译速度一直困扰着我,因为每次编译都需要十秒左右的时间,体验极差.而此前,编译时间一直保持在0 second. 经过我的多 ...
- jenkins发版svn
1.在mac上直接安装Jenkins,下载地址 : 2.安装插件:系统管理-->插件管理 publish over ssh Exec command: cd /usr/local/apache- ...