linux下socket编程
相关结构
//下边这两个结构定义在<sys/types.h>里
//一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段
 struct sockaddr
    {
	unsigned char sa_len;	//total length,整个结构体的长度,旧版本没有
	unsigned short  sa_family;   //地址族
	char	sa_data[14];   //地址的值
  //TCP/IP使用的地址结构
struct sockaddr_in
    {
       unsigned char	sin_len;	//total length
       short int                     sin_family;   //地址族,一般为AF_INET(ipv4),ipv6为(AF_INET6)
       unsigned short int      sin_port;      //端口号
       struct in_addr             sin_addr;      //ip地址
       char             sin_zero[8];  //没有使用(设置为0)
    }
相关函数-主调用
如果函数调用失败,都返回-1,调用失败会在全局变量error里有相应的值
不涉及到读取、发送的时候,调用正常都返回0
socket()
创建套接字
int socket(int family, int type, int protocol)
family: 协议或地址族,TCP/IP为PF_INET,(ipv6为PF_INET6),也可以使用AF_INET
type: 套接字类型
- 流式套接字:SCOK_STREAM, TCP
 - 数据报套接字:SOCK_DGRAM,UDP
 - 原始套接字:SOCK_RAW,没有经过处理的IP数据包,可以根据自己程序的要求进行封装
 
protocol:用来指定socket所使用的传输协议编号,通常设为0即可。
调用成功返回描述符
connect()
为套接字指明远程端点的地址。为TCP时,connect使用三次握手建立连接;为UDP时,connect仅指明远程端点,但是不向他发送任何数据
int connect(int sock, struct sockaddr \*serv_addr, int addrlen)
sock: 目的服务器的socket描述符
serv_addr:包含目的机器ip地址和端口号的指针
addrlen:sizeof(struct sockaddr)
调用成功返回0
send()/write() -TCP
linux下可以使用write(),将报文传递给目标主机
(int sock, char\* msg, int msglen, int flags);
flags:控制bit,指明是否接受带外数据和是否预览报文,一般为0
write(int sock, char* buf,  int buflen)
buf:含有数据缓存的地址
buflen:buf中的字节数
这两个函数调用成功时都返回传送的字节数
recv()/read() -TCP
从套接字中接收数据
nt recv(int sock, char\* buf, int len, int flags)
buf:存放数据的缓存地址
len:缓存的长度
flags:控制bit,指明是否接受带外数据和是否预览报文一般为0
read(int sock, char* buf,  int buflen)
调用成功都返回读取的字节数
sendto() -UDP
从一个结构中获取目的地址,然后发送报文
int sendto(int sock, char \*msg, int msglen, int flags, const struct sockaddr\* to, int\* tolen);
tolen:地址结构的字节长度
成功时,返回已发送的字节数
recvfrom() -UDP
从套接字获取下一个传入报文,并记录发送者的地址
 int recvfrom(int sock, char\* buf, int buflen, int flags, struct sockaddr\* from, int\* fromlen)
fromlen:缓存的长度,返回时为发送者地址的大小。
成功调用时,返回报文中的字节数
bind()
主要由服务器使用,指明本地ip地址和协议端口号
 int bind(int sock, struct sockaddr *localaddr, int addrlen)
成功时返回0
listen() -TCP
服务器调用,使套接字处于被动状态(准备接受传入请求)
int listen ( sock,queuelen)
queuelen:传入链接请求的队列大小(通常最大不超过5)
accept() -TCP
bind->listen->accept,从队列中取走下一个链接请求(或者一直在那里等待下一个连接请求到来),为请求创建新套接字,并返回新套接字描述符。
int accept(int sock, struct sockaddr \* addr, int\* addrlen)
addrlen:初始指明为addr的大小,调用返回时为存储在addr中的字节数
close()
终止通信,删除套接字,任何正在套接字上等待被读取的数据都将被抛弃。
linux使用了引用计数机制,可以多个进程共享一个套接字。close每被调用一次,引用计数减1,引用计数为0时才释放。
int close(int sock)
成功时返回0
shutdown()
部分关闭连接
int shutdown(int sock,int direction )
direction:0,终止进一步输入;1,终止进一步输出;2,终止输入和输出
辅助函数
整数转换
TCP/IP协议首部使用的二进制采用网络字节顺序(表示整数时,最高字节在前)
为了机器和网络字节顺序兼容,应当始终调用转换函数
htons(host to network short)
ntohs
htonl
ntohl
地址转换inet_addr
接受字符串(点分十进制),返回等价二进制表示的地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
查找域名对应ip地址gethostbyname
接收ASCII字符串域名,返回hostent结构,定义在<netdb.h>中
struct hostent
{
	char*	 h_name,	//正式主机名
	char**	 h_aliases,	//其他别名列表
	int		 h_addrtype,	//地址类型
	int		 h_length,	//地址长度
	char**	 h_addr_list	//一般主机可以有多个ip地址,h_addr_list用来
保存多个ip地址
}
#define h_addr h_addr_list[0]	//为了与早期的版本兼容
由服务名字得到熟知端口getservbyname
成功则返回一个servent结构指针,发生差错就返回空指针,结构定义在<netdb.h>中
servent* getservbyname(char\* name, char\* proto)
struct servent
{
char*		s_name;		//正式服务名
char**	s_aliases;	//其他别名列表
int 			s_port;	//该服务使用的端口
char		*s_proto;	//服务器所用的协议
};
### 根据协议名找到该协议的正式整数值getprotobyname(char\* name)
成功就返回protoent结构指针,结构定义在`<netdb.h>`中
```C
struct protoent
{
	char\*		p_name;	//协议正式名
	char\*\*	p_aliases;	//协议的别名列表
	int			p_proto;		//正式协议名
}
获取主机名字gethostname
以字符串形式返回主机名
int gethostname(char\* name, namelen)
name:放置名字的字符数组的地址
获取远程端点地址getpeername
需要已经建立链接
int getpeername(int sock, sockaddr\* remaddr, int\* addrlen)
remaddr:含有对端地址的sockaddr指针
addrlen:调用前为第二个参数的长度,调用后为远程端点地址的实际长度
设置/查看套接字参数
getsockopt()
setsockopt()
相关头文件
<sys/types.h>           //primitive system data types(包含很多类型重定义,如pid_t、int8_t等)
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
//上边两个sock调用必须包含
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、struct inaddr 、PROTO_ICMP、INADDR_ANY等
<sys/types.h>           //primitive system data types(包含很多类型重定义,如pid_t、int8_t等)
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
												
											linux下socket编程的更多相关文章
- Linux下Socket编程的端口问题( Bind error: Address already in use )
		
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
 - linux下socket编程实例
		
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
 - Linux下socket编程基本知识
		
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
 - LInux下socket编程学习笔记
		
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
 - [转] - linux下socket编程实例
		
一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...
 - c++ 网络编程(七) LINUX下  socket编程  基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法
		
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...
 - linux下socket编程-进程间通信
		
一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...
 - 3、linux下Socket编程-TCP/UDP
		
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
 - linux 下socket编程
		
原理 类unix系统中, 一切皆文件, 诸如磁盘文件, 显卡, 内核驱动, 网络协议栈等 socket就是linux中提供的用于网络通信的文件接口, 两台机器之间可以读写消息 在使用socket真正的 ...
 
随机推荐
- 聊聊并发(七)——Java中的阻塞队列
			
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...
 - Selenium关键字驱动测试框架Demo(Java版)
			
Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html
 - linux ulimit调优
			
1,说明:ulimit用于shell启动进程所占用的资源.2,类别:shell内建命令3,语法格式:ulimit [-acdfHlmnpsStvw] [size]4,参数介绍:-H 设置硬件资源限制. ...
 - 让Windows 7变成WIFI热点
			
360要推便携路由器,个人觉得其主要目的是盯住了用户无线设备上的信息.因为如果用户移动设备都通过它这个路由器走的话,未加密的数据全部在他掌控之中. 其实Windows 7以上的系统是非常容易建立无线热 ...
 - led显字风扇原理?
			
神奇的是上面的图案居然会变,十分好奇,求告知原理?? 其实就是依靠转速计算出LED灯变化的频率.这点和老式CRT的显示原理差不多.比如说风扇的转速时60rpm就是每分钟60圈,每秒1圈(当然实际转速快 ...
 - python 字符串编码
			
通过字符串的decode和encode方法 1 encode([encoding,[errors]]) #其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib ...
 - java计算当前周开始日期&结束日期
			
public static Date getFirstDayOfWeek(Date date) { Calendar c = new GregorianCalendar(); c.setFirstDa ...
 - annotation:@Override出现The method of type must override asuperclass解决方案
			
原因追踪及解决办法: 1. 查阅资料发现说在jdk1.5下要使用@Override这个annotation必须保证被标注的方法来源于class而不是interface. 2. 即使自己的jdk是1.6 ...
 - 解决mysql“Access denied for user 'root'@'localhost'”
			
解决mysql“Access denied for user 'root'@'localhost'” 分类: linux 2011-01-14 00:23 147547人阅读 评论(3) 收藏 举报 ...
 - MVVMlight框架应用:Data Binding、Command
			
常用Wpf开发中我们在ViewModel中实现INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的:在MVVMLight框架里,这里我们定 ...