【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 知 ...
随机推荐
- CANdbc编辑器的下载和入门介绍
candb 是汽车CAN总线dbc文件的常用编辑软件之一,下面介绍如何下载和安装,本人电脑使用的是win7 64bit. https://download.csdn.net/download/wuku ...
- 解决忘记mysql中的root用户密码问题
如果忘了数据库中的root密码,无法登陆mysql. 解决步骤: 1. 使用“--skip-grant-tables”启动数据库 ~]#systemctl stop mysql ~]#mysqld_s ...
- BZOJ 1912: [Apio2010]patrol 巡逻 (树的直径)(详解)
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1912 题解: 首先,显然当不加边的时候,遍历一棵树每条边都要经过两次.那么现在考虑k==1 ...
- Manjaro更新出现冲突
➜ ~ sudo pacman -Syyu :: Synchronizing package databases... core 147.5 KiB 1378K/s 00:00 [########## ...
- 解题:SDOI2018 战略游戏
题面 先圆方树然后建虚树,答案就是虚树大小.虚树没必要建出来,把原来的点的点权设为1,直接dfs序排序后相邻点求距离加上首尾两个点的距离,最后除以二(画一下可以发现是正反算了两遍),注意还要去掉询问点 ...
- 【洛谷P1082】同余方程
题目大意:求关于 \(x\) 的同余方程 \[ax \equiv 1 \pmod {b}\] 的最小正整数解. 题解:exgcd 板子题. 代码如下 #include <bits/stdc++. ...
- Flask filter过滤器
简单的数据集体添加样式输出用管道过滤,除了flask模块以外不需要导其他的包 <head> <meta charset="UTF-8"> <meta ...
- opencv mat裁剪
主要记录的就是对Mat裁剪后,新Mat指向的内存和原来的Mat共用. OpenCV入门教程(3)-Mat类之选取图像局部区域
- 老项目用webpack中文乱码问题解决记录
有个很久(有多久呢,你还记得jquery1.6的年代吗...)的项目需要新加一些功能,又想使用新的生产力工具比如说webpack,es6,vue神马的.原来的项目整体都是用GBK编码的,这特么...坑 ...
- nginx安装配置: configure命令
configure命令用来配置nginx编译环境. 该命令定义了系统各方面功能,包括允许nginx使用的连接处理方式. 其执行结果是生成一个Makefile文件. configure命令支持如下参数: ...