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

系统: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. Naive Operations HDU6315 (杭电多校2G)

    让ci = ai / bi, 求sum(ci)的值,因为每次 ai 都是加一的,那么我可以用一颗线段树来维护每个 i 位置的 ai 距离达到 bi 还需要的数的最小值,更新是每次都减一,如果我某一个区 ...

  2. BZOJ2801/洛谷P3544 [POI2012]BEZ-Minimalist Security(题目性质发掘+图的遍历+解不等式组)

    题面戳这 化下题面给的式子: \(z_u+z_v=p_u+p_v-b_{u,v}\) 发现\(p_u+p_v-b_{u,v}\)是确定的,所以只要确定了一个点\(i\)的权值\(x_i\),和它在同一 ...

  3. poj 3186 Treats for the Cows(dp)

    Description FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for gi ...

  4. Spring 声明式事务

    事务的特性/概念 事务:一组操作要么都成功要么失败: 事务的四个关键属性(ACID): 原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上 ...

  5. 洛谷P1196 银河英雄传说

    大意:你有30000个队列,第i个队列中只有i 有T个操作,1,把某个队列头接到另一个队列尾. 2,问两个元素之间的距离. 本题主要有三种解法. ①带权并查集. 具体来说就是,并查集维护当前集合的大小 ...

  6. 第十六节,使用函数封装库tf.contrib.layers

    这一节,介绍TensorFlow中的一个封装好的高级库,里面有前面讲过的很多函数的高级封装,使用这个高级库来开发程序将会提高效率. 我们改写第十三节的程序,卷积函数我们使用tf.contrib.lay ...

  7. 第十四节,TensorFlow中的反卷积,反池化操作以及gradients的使用

    反卷积是指,通过测量输出和已知输入重构未知输入的过程.在神经网络中,反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积神经网络,没有学习训练的过程.反卷积有着许多特别的应用,一般可以用 ...

  8. C++基础知识--DAY4

    今天主要讲的是类中除了构造器析构器以外的拷贝构造器,运算符重载等问题 首先是拷贝构造器 1. copy constructor(拷贝构造) 其也是构造器,其地位和constructor的地位是一样的 ...

  9. (栈)leetcode 946. Validate Stack Sequences

    Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...

  10. Qt ------ excel 操作

    写 excel // step1:连接控件 QAxObject* excel = new QAxObject(this); excel->setControl("Excel.Appli ...