【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 知 ...
随机推荐
- luogu4145 上帝造题的七分钟2 (线段树)
题意:给一个数列,维护两个操作,区间开根号.询问区间和 注意到1e12开根号六次后就变成1,而且根号1等于1 也就是说,就算我们用单点修改,只要跳过1,那么修改的次数最多也就是6n 那么维护一个区间最 ...
- [JSOI2008]Blue Mary的战役地图(二分+哈希)
Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提高自己的水平. 由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打 ...
- 在 Docker 中使用 mysql 的一些技巧
启动到后台: docker-compose start docker-composer 执行命令: entrypoint: pwd app: build: ./app working_dir: /a ...
- js jquery select 操作 获取值,选中选项,增加,修改,删除
select示例: <select id="sel"> <option value="1">one</option> < ...
- Filter(过滤器)
一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...
- Linux 上 nginx配置
1:安装工具包 wget.vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc g ...
- go 学习资源和GitHub库
go httprouter 源码包 https://github.com/julienschmidt/httprouter 用例 https://github.com/gsingharoy/httpr ...
- TF报错解决
一.import tensorflow #h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubd ...
- Python 排序和numpy排序,得到排序后索引序列(及源list的序列)
Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...
- 面向对象【day08】:类的起源与metaclass(二)
本节内容 1.概述 2.类的起源 3.__new__方法 4.__metaclass__方法 一.概述 前面我们学习了大篇幅的关于类,通过类创建对象,那我们想知道这个类到底是怎么产生的呢?它的一切来源 ...