趁着计算机网络这门课布置了课程设计,学习下网络编程。

系统: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
以上完成了三个基本操作:
  1. 创建套接字
  2. 建立与服务器的连接
  3. 发送和接收信息
【Over】

【C++】 网络编程 01的更多相关文章

  1. 网络编程01 · 艺

    Web Socket和Socket 套接字,实际就是传输层的接口.用于抽象传输层,隐藏细节.一对套接字可以进行通信. Web Socket,是基于TCP协议的.类似于,http. 为什么需要Web S ...

  2. python网络编程01 /C/S架构|B/S架构、网络通信原理、五层协议、七层协议简述、端口映射技术

    python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述.端口映射技术 目录 python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述. ...

  3. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  4. 从零探索Java网络编程01之 TCP/IP 与 Socket

    最近完成了几项比较简单的项目, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧?  一个普通的控制台日志映入了我的眼帘(孽缘呀): (图中使用 SpringBoot 的 log4j 来输出日志 ...

  5. python网络编程01

    1.什么是C/S架构? 客户端/服务器架构.实现服务端软件与客户端软件基于网络的通信. 2.互联网协议是什么?分别介绍五层协议中每一层的功能? 互联网协议是指用于互联网通信的规范.分为:osi七层.t ...

  6. 【网络编程01】socket的基础知识-简单网络通信程序

    1.什么是socket socket(套接字),简单来说是IP地址与端口(port)的组合,可以与远程主机的应用程序进行通信.通过IP地址可以确定一台主机,而通过端口则可以确定某一个应用程序.IP+端 ...

  7. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  8. day39-网络编程01

    Java网络编程01 1.网络相关的概念 1.1网络通信和网络 网络通信 概念:两台设备之间通过网络实现数据传输 网络通信:将数据通过网络从一台设备传输到另一台设备 java.net包下提供了一系列的 ...

  9. 01网络编程(基础知识+OSI七层协议+TCP与UDP)

    目录 01 网络编程 一.软件开发架构 1.1 CS架构 1.2 BS架构 二.网络理论前戏 2.1 简介 2.2 常见硬件 三.OSI七层协议(五层) 3.1 七层协议 3.2 五层协议 3.3 知 ...

随机推荐

  1. C/C++ 控制台窗口暂停

    为什么我看不到控制台的输出结果? 在编写C++程序中,经常会出现,控制台窗口一闪就消失了的情况 为什么会这样? 原因简单到有点可笑:因为程序运行结束了 对于控制台程序,操作系统让它开始运行前会为它造一 ...

  2. PHP使用自定义key实现对数据加密解密

    // 加密 function encryptStr($str, $key){ $block = mcrypt_get_block_size('des', 'ecb'); $pad = $block - ...

  3. nio 阻塞 非阻塞 同步 异步

    https://mp.weixin.qq.com/s/5SKgdkC0kaHN495psLd3Tg 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相 ...

  4. java thread 线程40个问题汇总

    http://www.codeceo.com/article/40-java-thread-problems.html 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了, ...

  5. 【SDOI2008】仪仗队

    //裸的欧拉函数//y=kx//求不同的k有多少#include<bits/stdc++.h> #define ll long long #define N 40010 using nam ...

  6. [AC自动机][学习笔记]

    用途 AC自动机适用于一类用多个子串在模板串中匹配的字符串问题. 也就是说先给出一个模板串,然后给出一些子串.要求有多少个子串在这个模板串中出现过. KMP与trie树 其实AC自动机就是KMP与tr ...

  7. Django 路由报错友好提示

    这个方法要在设置路由文件内使用也就是urls.py内. """mysite URL Configuration The `urlpatterns` list routes ...

  8. 神经网络中w,b参数的作用(为何需要偏置b的解释)

    http://blog.csdn.net/xwd18280820053/article/details/70681750 可视图讲解神经元w,b参数的作用 在我们接触神经网络过程中,很容易看到就是这样 ...

  9. 文献笔记:Genome-wide associations for birth weight and correlations with adult disease

    该文献纳入了EGG(Early Growth Genetics Consortium)和UK biobank两大数据库,分为欧洲祖先和非欧洲祖先群体.这两个数据用到的样本量分别如下: Early Gr ...

  10. Mock2 moco框架的http协议get方法Mock的实现

    首先在Chapter7文件夹下再新建一个startGet.json startget.json代码如下,因为是get请求,所以要写method关键字,有两个,一个是有参数,一个是无参数的请求. [ { ...