Linux_c++ TCP套接字编程函数
socket函数
int socket(int domain,int type,int protocol);
domain为协议簇,取值为以下几点
- AF_INET:使用Ipv4协议
- AF_INET6:使用Ipv6协议
- AF_UNIX:本地通信,一般是指在当客户端与服务器在同一个机器上使用。
- AF_NETLINK:内核与用户态之间通信
type是指套接字的类型,取值为以下几点
- SOCK_STREAM:数据流通信,即使用TCP通信。
- SOCK_DGRAM:数据包通信,即使用UDP通信。
protocol一般为0
头文件#include<sys/types.h> #include<sys/socket.h>
返回值:
函数执行成功,则返回一个正整数,该正整数为套接字描述符,如果函数执行失败,则返回-1。
#include<sys/types.h> //基本系统数据类型
#include<sys/socket.h>
#include<iostream>
using namespace std;int main()
{int sockfd;sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){cout<<"create socket error"<<endl; }cout<<sockfd<<endl;return 0;
}
bin函数
bin函数为绑定地址空间函数,在套接字结构体中,有一个默认的IP地址与默认的端口号,但是服务器程序必须调用bind函数绑定自己的IP地址信息和特定的端口号。
int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen)
- sockfd:标识一个待绑定的套接字描述符
- addr:是一个sockadddr的结构体,其有3种形式,分别为Ipv4、Ipv6、Unix
- addrlen:指定addr的缓冲区长度
//Ipv4地址域
struct sockaddr_in{sa_family_t sin_family; //地址簇AF_INETin_port_t sin_port; //端口struct in_addr sin_addr; //地址
};struct in_addr{uint32_t s_addr; //网络字节序
};
//Ipv6地址域
struct sockaddr_in6{sa_family_t sin6_family; //AF_INET6in_port_t sin6_port; //端口uint32_t sin6_flowinfo; struct in6_addr sin6_addr;uint32_t sin6_scope_id;
}
struct in6_addr{unsigned char s6_addr[16];
};
bin函数的使用
#include<sys/types.h> //基本系统数据类型
#include<sys/socket.h>
#include<iostream>
using namespace std;int main()
{struct sockaddr_in sockaddr;int port = 3000;int socketfd;memset(&sockaddr,0,sizeof(sockaddr));sockaddr.sin_family = AF_INET;sockaddr.sin_addr.s_addr = htonl(127.0.0.1);sockaddr.sin_port = htons(port);socketfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){cout<<"socket create error"<<endl;return -1;}return 0;
}
listen函数
主要是用于服务端监控。
int listen(int pid,int backlog);
pid:为监控的套接字描述符
backlog:表示连接请求的最大连接数
accept函数
用于服务器程序从处于监听状态的流式套接字的客户连接请求队列中获取第一个客户端请求,并创建一个新的套接字用于和客户端通信。
int accetp(int pid,struct sockaddr* addr,socklen_t *addrlen)
- pid:为处于监听状态的流式套接字描述符
- addr:获得客户端的协议地址,包括Ip与端口号
- addrlen:客户端地址结构的大小。
struct sockaddr_in NewSocket;
int addrlen;
addrlen = sizeof(NewSocket);
int NewServerSocket = accept(ListenSocket,(struct sockaddr*)&NewSocket,&addrlen);
if(NewServerSocket == -1)
{cout<<"accept socket error"<<endl;
}
connect函数
用于客户端连接服务器
int connect(int pid,const struct sockaddr* name,socklen_t namelen)
- pid:还没有连接的套接字描述符
- name:服务器套接字的地址结构的指针
- namelen:套接字地址结构的大小
如果函数执行成功,则返回0,否则返回-1
write函数
无论是客户端还是服务器都可以使用write函数向TCP连接的另一端发送数据。
int write(int pid,const char* buf,int len)
- pid:发送端的套接字
- buf:发送缓冲区
- len:缓冲区的大小
返回值:返回实际发送的字节数
read函数
无论是客户端还是服务器都可以使用read函数接收数据。
int read(int pid,char *buf,int len)
- pid:套接字描述符
- buf:缓冲区,用于存储读取到的数据
- len:缓冲区的大小
返回值:返回实际读取的字节数,如果连接关闭,则返回0
send函数
功能类似于write函数
size_t send(int pid,const char* buf,size_t len,int flag)
前三个参数的含义于write类似,flag为传输控制标志。
- 0:表示常规,与write类似
- MSG_DONTROUTE:通知内核目的主机在直接连接的本地网络上
- MSG_DONTWAIT:将单个I\O操作设置为非阻塞模式
返回值:返回实际发送的字节数
recv函数
功能类似于read函数
ssize_t recv(int sockfd,void *buf,size_t len,ing flag)
前三个参数的含义于read类似,flag为传输控制标志。
- 0:表示常规,与read类似
- MSG_DONTWAIT:将单个I\O操作设置为非阻塞模式
- MSG_OOB:读物数据是带外数据而不是一般数据
返回值:返回实际读取的字节数,如果连接关闭,则返回0
close
关闭套接字
int close(int sockfd)
成功返回0,失败返回-1
Linux_c++ TCP套接字编程函数相关推荐
- 【UNIX网络编程(二)】基本TCP套接字编程函数
基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...
- 套接字编程---2(TCP套接字编程的流程,TCP套接字编程中的接口函数,TCP套接字的实现,TCP套接字出现的问题,TCP套接字多进程版本,TCP套接字多线程版本)
TCP模型创建流程图 TCP套接字编程中的接口 socket 函数 #include <sys/types.h> /* See NOTES */ #include <sys/sock ...
- 《网络编程》基本 TCP 套接字编程
在进行套接字编程之前必须熟悉其地址结构,有关套接字的地址结构可参考文章<套接字编程简介>.基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始,它返回一个套接字描述 ...
- 《UNIX网络编程 卷1:套接字联网API》学习笔记——基本TCP套接字编程
UNIX网络编程--基本TCP套接字编程 socket 函数 connect 函数 bind 函数 listen 函数 accept 函数 fork 和 exec 函数 并发服务器 close 函数 ...
- UNIX环境编程(c语言)--套接字--基本TCP套接字编程
目录 准备知识 字节序 字节序转换函数 字节操纵函数 地址转换函数 地址结构 基本TCP套接字编程 概要 socket函数 bind函数 listen函数 accept函数 connect函数 通信函 ...
- TCP套接字编程(C语言)
本篇主要内容介绍: 介绍TCP套接字基本概念 介绍TCP套接字编程流程 基本TCP套接字函数介绍 1.TCP套接字基本概念(非官方解释,个人总结) 套接字是一种网络API,提供一种进程间的通信方法,使 ...
- TCP套接字编程实例(一)
TCP套接字编程实例(一) TCP套接字编程第一部分我们先用单线程简单实现客户端的"发"和服务器的"收".话不多说,直接上代码. 1.Client部分: #in ...
- tcp套接字编程模型
1. tcp套接字编程 用下面的一张图可以清楚表示: 下面的python实现也很清晰: server: def tcplink(sock, addr):print 'Accept new connec ...
- 《计算机网络:自顶向下方法(原书第6版)》一2.7 TCP套接字编程
本节书摘来华章计算机<计算机网络:自顶向下方法(原书第6版)>一书中的第2章 ,第2.7节,(美)James F.Kurose Keith W.Ross 著 陈 鸣 译 更多章节内容可以访 ...
最新文章
- 阿里研究员谷朴:警惕软件复杂度困局
- springboot学习笔记(七)
- 解密QQ非会员漫游聊天记录
- Android开发之自定义输入框无法弹起键盘输入法的解决方法
- 阿里技术高P访谈之张俭恭:情义是阿里与外企的最大不同
- 为什么启动hbase shell后,创建按create 'test', 'cf'失败?
- leetcode771. 宝石与石头
- C#LeetCode刷题之#225-用队列实现栈(Implement Stack using Queues)
- Windows中木马之后桌面被篡改的恢复方法
- LINQ 优点 总结
- windows 7 引导过程概述
- mysql主从数据库不同步的2种解决方法(转)
- 周二强新概念c语言答案,新编C语言程序设计(周二强版)课后习题练习4答案
- hyper运算符_查询构造器
- HADOOP docker(二):HDFS 高可用原理
- 保留两位小数除法算式_小数除法计算题100道
- 联想E431 win10+Unbutun+Deepin系统安装
- 解决GitLab 502
- 成长中的SEO,应该避免这12个过时的优化策略(转载自:https://www.duiji.net)
- 微信小程序地理位置API使用流程
热门文章
- Mybatis经验总结
- 大话数据结构之数据结构
- Go学习笔记一:基础知识
- windows验证方式
- 【转】c++各种数据类型所占存储空间大小
- 用python画渐变的圆_python画环形图的方法
- bat批处理更改文件后缀/挑出两个文件夹下不同名的文件
- jpa jql 时间范围查询_SpringBoot整合JPA案例
- 中嵌套的页面如何操作父页面_UI设计中签到页面如何设计
- Flink-org.apache.flink.streaming.api.windowing.windows.Window