在网络编程中 socket 函数十分的常见,函数的返回值对应了一个类似于文件句柄的
数值,通过该数值可以进行后续的一系列 connect ,bind 函数的调用。
实质上就是在系统中为了收发数据开辟的一块缓冲区,这块缓冲区在系统的内核中
是以数组的方式实现的,每个数组中存放着一个指向缓冲区的指针。
而返回的数值便是指针作为元素在数组中的位序
socket 接口描述如下
#include
#include
int socket ( int domain , int type , int protocol ) ;
返回值:文件描述符
参数:
1. domain 用于指定创建套接字的时候所使用的协议族
可选值:
AF_UNIX: 本机内进行通信的套接字
AF_INET: 用于 IPv4 TCP/IP 协议
AF_INET: 用于 IPv6 TCP/IP 协议
2. type 用于指定套接字类型
可选值:
SOCK_STREAM : 创建 TCP 流套接字
SOCK_DGRAM : 创建 UDP 数据报套接字
SOCK_RAM : 创建原始套接字
3. protocol 通常设定为数值 0
代码实例 1
g++ socketTest.cpp -o socketTest
下面的代码运行结果为打印数值 3
其中 0 对应的是系统标准输入
1 对应的是系统标准输出
2 对应的是系统错误输出
-
//socketTest.cpp
-
#include <sys/socket.h>
-
#include <stdio.h>
-
#include <unistd.h>
-
-
int getSocketDone ()
-
{
-
int ret ;
-
-
ret = socket( AF_INET , SOCK_STREAM , 0 ) ;
-
if ( ret < 0 )
-
{
-
perror ("socket") ;
-
return ret ;
-
}
-
return ret ;
-
}
-
-
int main ( int c , char **v )
-
{
-
-
int sock_fd = getSocketDone () ;
-
printf ("\n here is the sock_fd %d\n", sock_fd) ;
-
-
return 0 ;
-
}
-
~
代码实例 2
代码编译命令
g++ socketTest2.cpp -o socketTest2
代码运行
打印数值 3...3 一共十个
说说明的问题是,每次close 方法调用之后系统便会收回刚刚通过 socket 分配的缓冲区
所以每次通过 socket 生成的数值是可以重复使用的
如果将 close ( sock_fd ) ; 注释掉,则每次生成的数值都不同
-
// socketTest2.cpp
-
-
#include <sys/socket.h>
-
#include <stdio.h>
-
#include <unistd.h>
-
-
int getSocketDone ()
-
{
-
int ret ;
-
-
ret = socket( AF_INET , SOCK_STREAM , 0 ) ;
-
if ( ret < 0 )
-
{
-
perror ("socket") ;
-
return ret ;
-
}
-
return ret ;
-
}
-
-
int main ( int c , char **v )
-
{
-
-
for ( int i = 0 ; i < 10 ; i++ )
-
{
-
int sock_fd = getSocketDone () ;
-
printf ("\n here is the sock_fd %d\n", sock_fd) ;
-
-
close ( sock_fd ) ;
-
}
-
return 0 ;
-
}
阅读(926) | 评论(0) | 转发(0) |