socket 函数
1.创建套接字并返回一个描述符,该描述符可以用来访问套接字
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type ,int protocol);
//domain 指定协议族 ,type指定套接字通信类型,protocol 指定使用的协议
domain 参数可以如下 : AF_UNIX//UNIX域协议(文件系统套接字)
AF_INET //ARPA因特网协议(UNIX网络套接字)
AF_ISO //ISO标准协议
AF_NS //施乐(Xerox)网络系统协议
AF_IPX //Novell IPX 协议
AF_APPLETALK//Appletalk DDS
types 参数如下 :SOCK_STREAM //可靠有序,面向链接的双向字节流, SOCK_DGRAM //数据服务流
protocol 一般默认为0即可
2.套接字地址
每个套接字都有自己的地址格式,对AF_UNIX域套接字来说,由结构sockaddr_un 来描述,定义在头文件 sys/un.h
地址格式:
常用的有两种socket域:AF_UNIX或AF_INET,因此就有两种地址格式:sockaddr_un和sockaddr_in,分别定义如下:
struct sockaddr_in {
shrot int sin_family;//与创建时候的协议族保持一致
unsigned short int sin_port;//端口, 1024 以上
struct in_addr sin_addr;
}
IP地址结构 in_addr 的定义
struct in_addr{
unsigned long int s_addr;//IP地址inet_addr("127.0.0.1"); 这个函数将IP地址返回为这个格式的
}
struct sockaddr_un
{
sa_family_t sun_family; ////与创建时候的协议族保持一致
char sun_path[]; //命名的名称
}
3.套接字命名,
想要通过socket调用创建的套接字可以被其他进程使用,服务器程序就必须给该套接字命名。这样AF——UNIX套接字就会关联
到一个文件系统的路径名,
#include<sys/socket.h>
int bind(int socket , const struct sockaddr *address.size_t address_len);
bind 系统调用把address中的地址分配给与文件描述符socket关联的为命名套接字,地址结构的长度由参数 address_len传递
地址的长度和格式取决于地址族,bind调用需要将一个特定的地址结构指针转换为只想通用地址类型 struct sockaddr *
bind 调用成功返回0。失败反-1
4.创建套接字列队
为了能够在套接字上接受进入的连接,服务器程序必须创建一个列队来保存未处理的请求,
#include<socket.h>
int listen(int socket ,int backlog);
backlog 为未处理连接最大数目,一般为5
listen成功返回0,失败-1
5.接受连接
一旦服务器程序创建并命名了套接字以后,他就可以通过 accept 系统调用来等待客户建立对应套接字的连接
#include<sys/socket.h>
int accept (int socket .struct sockaddr *address ,size_t *address_len)
accept系统调用只有当 有客户程序试图连接到 socket参数指定的套接字时才返回。
6.请求连接
客户程序通过在一个未命名套接字和服务器监听套接字之间建立连接的方法来连接服务器,
#include<sys/socket.h>
int connect(int socket ,const struct sockaddr *address ,size_t address_len);
socket参书指定的套接字将连接到这个服务器的套接字
address 只想结构的长度由address_len指定,
7.关闭套接字
close(int socket) 关闭套接字
8.返回对应于给定地址的主机信息。主机名,IP地址等
#include<netdb.h>
struct hostent *gethostbyaddr(const void * addr, size_t len, int type);
addr:指向网络字节顺序地址的指针。
len: 地址的长度,在AF_INET类型地址中为4。
type:地址类型,应为AF_INET。
struct hostent {
char FAR * h_name; 正规的主机名字(PC)
char FAR * FAR * h_aliases; 一个以空指针结尾的可选主机名队列
short h_addrtype; 返回地址的类型,对于Windows Sockets,这个域总是PF_INET。
short h_length;每个地址的长度(字节数),对应于PF_INET这个域应该为4。
char FAR * FAR * h_addr_list; 应该以空指针结尾的主机地址的列表,返回的地址是以网络顺序排列的}
9.返回对应于给定服务名和协议名的相关服务信息。
#include<netdb.h>
sturct servent *getservbyname(const char *name ,const char *proto )
name: 一个指向服务名的指针。
proto: tcp或udp
struct servent {
char FAR * s_name; 正规的服务名。
char Far * FAR * s_aliases; 一个以空指针结尾的可选服务名队列。
short s_port; 连接该服务时需要用到的端口号,返回的端口号是以网络字节顺序排列的。
char FAR * s_proto; 连接该服务时用到的协议名。
};
10.返回本地主机的标准主机名
#include<unistd.h>
int gethostname(char *name ,int namelength);
name: 一个指向将要存放主机名的缓冲区指针。
namelen:缓冲区的长度。
11.
#include<arpa/inet.h>
char *inet_ntoa(struct in_addr in);
将in_addr 格式的IP地址转换成 4个点格式的。
socket 函数的更多相关文章
- 使用socket()函数创建套接字
在Linux中,一切都是文件,除了文本文件.源文件.二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件.例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout ...
- PHP Socket实现websocket(二)Socket函数
PHP socket函数是调用系统的的Socket函数,可以参考C语言的socket函数. Socket函数:http://php.net/manual/en/book.sockets.php 服务器 ...
- Windows套接字Socket函数
1.使用套接字函数之前,先要加载套接字函数库: #include "Winsock2.h" #pragma comment(lib,"Ws2_32.lib") ...
- socket函数
为了执行网络IO,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 int socket(int family,int type,int protocol); 其中,famil ...
- OVERLAPPED相关的socket函数介绍
OVERLAPPED相关的socket函数介绍 上一篇文章介绍了<Windows核心编程>OVERLAPPED结构与内核对象IOCompletionPort相关概念,见http://www ...
- windows socket函数详解
windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...
- python socket 函数介绍
socket 函数原型:socket.socket([family[,type[,proto]]]) family参数取值(协议族): socket.AF_INET -->ipv4 ...
- 【读书笔记】socket函数
socket函数 简介 应用程序调用socket函数来创建一个能够进行网络通信的套接字. 1 2 3 4 5 /* 头文件 */ #include <sys/types.h> #inclu ...
- socket()函数介绍
socket()函数介绍 socket函数介绍 函数原型 domain type protocol errno 示例 函数原型 socket()函数的原型如下,这个函数建立一个协议族为domain.协 ...
- php socket 函数
创建基于socket的应用程序,就需要详细了解socket的操作方法,这里列举PHP中一些重要的socket函数. 1. socket_create ( int $domain , int $ty ...
随机推荐
- linux网络编程tcp
之前学习的时候笔记没有保存好,这次重新编写一个案例. 客户端实现程序代码: #include <string.h> #include <stdlib.h> #include & ...
- 前端之jquery
前端之jquery 本节内容 jquery简介 选择器和筛选器 操作元素 示例 1. jquery简介 1 jquery是什么 jQuery由美国人John Resig创建,至今已吸引了来自世界各地的 ...
- 如何查看当前Ubuntu系统的版本
如何查看当前Ubuntu系统的版本 说来也惭愧,用Ubuntu差不多快1个月了,双系统是让朋友安的,只知道自己使用的是什么12版本的,具体怎么看还不知道,下面写一下查看当前Linux系统的版本的方法 ...
- 通过form表单的形式下载文件。
在项目中遇到问题,要求动态拼接uri下载文件.但是由于项目的安全拦截导致window.location.href 和 window.open等新建窗口的方法都不行. 无意间百度到了通过form表单来下 ...
- [LeetCode] Linked List Random Node 链表随机节点
Given a singly linked list, return a random node's value from the linked list. Each node must have t ...
- [LeetCode] Smallest Rectangle Enclosing Black Pixels 包含黑像素的最小矩阵
An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...
- [LeetCode] Strobogrammatic Number III 对称数之三
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- Intellij IDEA 快捷键
Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 ...
- 开源遥感平台opticks插件开发指南
Opticks是一款开源的遥感数据处理平台,与其同类开源软件OSSIM一样,支持种类丰富的数据文件格式,但其最大特点为设计精巧的插件开发模式,在设计技巧上,系统提供了良好的封装特性,即使插件开发者对框 ...
- Python的多线程(threading)与多进程(multiprocessing )
进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...