网络编程基础了解

socket套接字

socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段。

linux中的网络编程通过socket接口实现,socket既是一种特殊的IO,提供对应的文件描述符。一个完整的socket都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每个socket有一个本地唯一Socket,由操作系统分配。

定位某个计算机用IP,定位某个服务用端口。

创建Socket

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

返回:成功返回描述符,出错返回-1

(详细可以利用 指令 man socket 查看)

参数解释

domain

  AF_INET    IPv4因特网域

  AF_INET6    IPv6因特网域

  AF_UNIX      unix域

  AF_UNSPEC  未指定

protocol

  通常为0,表示按给定的域和套接字类型选择默认协议。

type(指定采用何种协议)

  SOCK_STREAM   采用TCP协议(流式的套接字可以提供可靠的面向连接的通信流)

  SOCK_DGRAM    采用UDP协议(数据报套接字)

  SOCK_RAW    主要用于新的网络协议实现的测试。

  SOCK_SEQPACKET 长度固定、有序、可靠的面向连接报文传递

  一般采用前两种方式。。。。。。。

字节序

字节序分为大端和小端字节序

大端字节序:高字节在前,低字节在后

小端字节序:低字节在前,高字节在后

不同体系采用不同的字节序

网络字节序:在网络中使用的字节序称为网络字节序,采用大端字节序。

字节序的转换函数

网络传输的数据一定要统一顺序,所以需要字节序转换

uint32_t htonl(uint32_t hostlong); 将一个32位整数由主机(host)字节序转换成网络(network)字节序

uint16_t htons(uint16_t hostshort); 将一个16位整数由主机(host)字节序转换成网络(network)字节序

uint32_t ntohl(uint32_t netlong); 将一个32位整数由网络(network)字节序转换成主机(host)字节序

uint16_t ntohs(uint16_t netshort); 将一个16位整数由网络(network)字节序转换成主机(host)字节序

地址结构

通用地址结构

#include <sys/socket.h>

struct sockaddr{

  unsigned short sa_family;    //Internet地址族,AF_XXX

  char sa_data[14];      //14bytes的协议地址

}

//一般不用

因特网地址结构

struct in_addr{

  in_addr_t s_addr;    //ipv4地址

};

struct sockaddr_in{

  short int sin_family;      //Internet地址族如AF_INET(主机字节序)

  unsigned short int sin port;    //端口号,16位值(网络字节序)将数据转换之后赋值

  struct in_addr sin_addr;      //Internet地址,32位ipv4地址(网络字节序)要将点分十进制转换成网络字节序,转化函数如下

  unsigned char sin_zero[8];    //添0(为了格式对其的填充位)

};

点分十进制转、网络字节序转换函数

#include <arp/inet.h>//头文件

const char *inet_ntop(int domain, const void *restrict addr, char *restrict str, socklen_t size);

返回:成功返回地址字符串指针,出错返回NULL

功能:网络字节序转换成点分十进制 如:127.0.0.1

int inet_pton(int domain, const char *restrict str, void *restrict addr);

返回:成功返回1, 无效格式返回0, 出错返回-1

功能:点分十进制转换成网络字节序

(详情可利用指令 man inet_pton 查看函数)

参数

domain:Inter 地址族,如AF_INET

addr: Internet地址,32位IPv4地址(网络字节序)

str:地址字符串(点分十进制)指针

size:地址字符串大小

案例

struct sockaddr_in sockin;    //定义一个结构体

char buff[16];

memset(&sockin, 0, sizeof(sockin));

sockin.sin_family = AF_INET;    //地址族

sockin.sin_port = htons((short)8888); //端口号,必须是网络字节序

//填充sin_addr 需要将点分十进制转换为网络字节序

if(inet_pton(AF_INET,"127.0.0.1",&sockin.sin_addr.s_addr) <= 0)

{

  //进行错误处理

}

printf("%s\n",inet_ntop(AF_INET, &sockin.sin_addr.s_addr, buff, sizeof(buff)));

TCP编程模型

客户端调用序列

  调用socket函数创建套接字

  调用connect连接服务器端

  调用I/O函数(read/write)与服务器端通讯

  调用close关闭套接字

服务器端调用序列

  调用socket函数创建套接字

  调用bind绑定本地地址和端口

  调用listen启动监听

  调用accept从已经连接的队列中提取刻苦连接

  调用I/O函数(read/write)与客户端通讯

  调用close关闭套接字

相关函数

 套接字与地址绑定

  绑定地址

  #include <sys/socket.h>

  int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

  返回:成功返回0,出错返回-1;

  

  查找绑定到套接字的地址

  #include <sys/socket.h>

  int getsockname(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);

  返回:成功返回0,出错返回-1

  获取对方地址

  #include<sys/socket.h>

  int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);

  返回:成功返回0,出错返回-1

 建立连接

  服务器端

  #include <sys/socket.h>

  int listen(int sockfd, int backlog);

  backlog 指定进行客户端连接排队的队列长度。

  int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);

  客户端

  #include <sys/socket.h>

  int connect(int sockfd, const struct sockaddr *addr, socklen_t len);

下一节,编写一个简单的TCP程序

网络编程基础之TCP编程学习(一)的更多相关文章

  1. C#网络程序设计(3)网络传输编程之TCP编程

        网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程.     (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ...

  2. 如何夯实(Java)编程基础,并深入学习和提高

    如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...

  3. Spark编程基础_RDD初级编程

    摘要:Spark编程基础_RDD初级编程 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...

  4. 网络编程基础之TCP学习(二)编程案例

    TCP网络编程流程如下: 实现功能:服务器端与客户端成功通讯后返回get! 服务器端程序 #include <netdb.h> #include <sys/socket.h> ...

  5. 第1章 网络编程基础(4)——TCP/IP通信

    TCP协议利用网络层IP协议提供不可靠的通信服务,解决分组的重传和排序问题,为应用程序提供可靠的.端到端的.面向连接的基于字节流的服务. 对等TCP传输实体间的通信具有如下特征: 全双工 只支持两个端 ...

  6. Java网络编程基础之TCP粘包拆包

    TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...

  7. Socket编程基础——面向连接TCP

    WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock ...

  8. 第1章 网络编程基础(2)——Socket编程原理

    Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...

  9. 【C编程基础】多线程编程

    基础知识 1.基本概念 (1)线程,即轻量级进程(LWP:LightWeight Process),是程序执行流的最小单元. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位. (2)线程同步 ...

随机推荐

  1. 无法连接App Store

    试了很多网上的方法,都没有效果,最后把hosts文件清空了,就可以了,不知道是为啥,同一份hosts文件在屋里能用,公司就不能用.

  2. 基于MSP430G2231实现多路数据采集器

    基于MSP430G2231实现多路数据采集器 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电 ...

  3. 在React native 如何写if判断和for循环

    在vue中一般在需要判断时都是通过if语句来实现的,但是在react native中一般则通过三元运算法来实现. 具体代码如下所示. import React from 'react'; import ...

  4. Supported orientations has no common orientation with the application, and [UIAlertController shouldAutorotate] is returning YES

    某一个页面横屏时会出现崩溃的问题描述,原因是当你在AppDelegate中返回的设备方向是UIInterfaceOrientationMaskLandscapeLeft.但是你在视图控制器中返回支持自 ...

  5. laydate年份选择,关闭底框,点击指定年份就选择然后关闭控件,翻页不选择也不关闭控件

    如下图,翻页不选择也不关闭.点击指定年份时再选择和关闭控件 代码如下 // 默认没有选择,把判断赋值当前时间 var iYearCode = parseInt(new Date().getFullYe ...

  6. [转帖]拿小本本记下的Linux Shell常用技巧(一)

    拿小本本记下的Linux Shell常用技巧(一) https://zhuanlan.zhihu.com/p/73361101 一. 特殊文件: /dev/null和/dev/tty Linux系统提 ...

  7. plsql中文乱码 显示问号

    输入sql语句select * from V$NLS_PARAMETERS查看字符集,查看第一行value值是否为简体中文 解决方案: 新增环境变量 变量名: NLS_LANG 变量值: SIMPLI ...

  8. Lucas定理的运用及组合数奇偶性的判断

    组合数奇偶性的判断 对于C(n,k),若n&k == k 则c(n,k)为奇数,否则为偶数. 最直观的方法就是计算一下,然后看它的奇偶性:但是这个时间以及数据范围上都不允许: 另外一种方法就是 ...

  9. C++操作文件行(读取,删除,修改指定行)

    /******************************************************** Copyright (C), 2016-2018, FileName: main A ...

  10. PAT甲级 堆 相关题_C++题解

    堆 目录 <算法笔记>重点摘要 1147 Heaps (30) 1155 Heap Paths (30) <算法笔记> 9.7 堆 重点摘要 1. 定义 堆是完全二叉树,树中每 ...