网络编程基础之TCP编程学习(一)
网络编程基础了解
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编程学习(一)的更多相关文章
- C#网络程序设计(3)网络传输编程之TCP编程
网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程. (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ...
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- Spark编程基础_RDD初级编程
摘要:Spark编程基础_RDD初级编程 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...
- 网络编程基础之TCP学习(二)编程案例
TCP网络编程流程如下: 实现功能:服务器端与客户端成功通讯后返回get! 服务器端程序 #include <netdb.h> #include <sys/socket.h> ...
- 第1章 网络编程基础(4)——TCP/IP通信
TCP协议利用网络层IP协议提供不可靠的通信服务,解决分组的重传和排序问题,为应用程序提供可靠的.端到端的.面向连接的基于字节流的服务. 对等TCP传输实体间的通信具有如下特征: 全双工 只支持两个端 ...
- Java网络编程基础之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- Socket编程基础——面向连接TCP
WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock ...
- 第1章 网络编程基础(2)——Socket编程原理
Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...
- 【C编程基础】多线程编程
基础知识 1.基本概念 (1)线程,即轻量级进程(LWP:LightWeight Process),是程序执行流的最小单元. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位. (2)线程同步 ...
随机推荐
- (四)UML之顺序图(时序图)
一.概念 顺序图是交互图的一种形式,它显示对象沿生命线发展,对象之间随时间的交互表示为从源生命线指向目标生命线的消息.顺序图能很好地显示那些对象与其它那些对象通信,什么消息触发了这些通信,顺序图不能很 ...
- DTCMS,添加文章时,内容中第一张图片作缩略图,并且等比例缩放图片
DTCMS,添加文章时,内容中第一张图片作缩略图 admin/article/article_edit.aspx.cs 导入: using System.Drawing;using System.Dr ...
- Laravel用户认证系统的实现细节
原文地址:http://www.php.cn/php-weizijiaocheng-406076.html 这篇文章主要介绍了关于Laravel用户认证系统的实现细节,有着一定的参考价值,现在分享给大 ...
- OS选择题练习
一.死锁 1.设系统中有n个进程并发,共同竞争资源X,且每个进程都需要m个X资源,为使该系统不会发生死锁,资源X的数量至少为() A.n*m+1 B.n*m+n C.n*m+1-n D.无法预计 ...
- Python 用hashlib求中文字符串的MD5值 (转自 haungrui的专栏)
使用过hashlib库的朋友想必都遇到过以下的错误吧:“Unicode-objects must be encoded before hashing”,意思是在进行md5哈希运算前,需要对数据进行编码 ...
- Windows用Eclipse来开发hadoop的WordCount的helloworld
[学习笔记] 2.Win7用Eclipse来开发hadoop的WordCount的helloworld网上下载hadoop-eclipse-plugin-2.7.4.jar,将该jar包拷贝到Ecli ...
- git使用中的一些命令及心得
Git 与 SVN 区别点: 1.Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心 的区别. 2.Git 把内容按元数据方式存储,而 SV ...
- 笔记-10:处理时间的标准库-time库
1.time库介绍 主要用来处理时间的标准库. time库提供了系统级精确计时器的计时功能,可以用来分析程序性能,也可让程序暂停运行时间. time库的功能主要分为:时间处理.时间格式化.计时. 2. ...
- VS2013+WDK8.1 驱动开发环境配置
Windows Driver Kit 是一种完全集成的驱动程序开发工具包,它包含 WinDDK 用于测试 Windows 驱动器的可靠性和稳定性,本次实验使用的是 WDK8.1 驱动开发工具包,该工具 ...
- IDEA中通过Maven插件使用MyBatis Generator
这样做更简单,参考: IDEA集成MyBatis Generator 插件 详解