Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581628
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: C/C++

2015-03-26 14:08:49

在网络编程中 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 对应的是系统错误输出

点击(此处)折叠或打开

  1. //socketTest.cpp
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <unistd.h>

  5. int getSocketDone ()
  6. {
  7.   int ret ;

  8.   ret = socket( AF_INET , SOCK_STREAM , 0 ) ;
  9.   if ( ret < 0 )
  10.   {
  11.         perror ("socket") ;
  12.         return ret ;
  13.   }
  14.   return ret ;
  15. }

  16. int main ( int c , char **v )
  17. {

  18.   int sock_fd = getSocketDone () ;
  19.   printf ("\n here is the sock_fd %d\n", sock_fd) ;

  20.   return 0 ;
  21. }
  22. ~

代码实例 2

代码编译命令
g++ socketTest2.cpp -o socketTest2

代码运行
打印数值 3...3 一共十个
说说明的问题是,每次close 方法调用之后系统便会收回刚刚通过 socket 分配的缓冲区
所以每次通过 socket 生成的数值是可以重复使用的

如果将 close ( sock_fd ) ; 注释掉,则每次生成的数值都不同

点击(此处)折叠或打开

  1. // socketTest2.cpp

  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <unistd.h>

  5. int getSocketDone ()
  6. {
  7.   int ret ;

  8.   ret = socket( AF_INET , SOCK_STREAM , 0 ) ;
  9.   if ( ret < 0 )
  10.   {
  11.         perror ("socket") ;
  12.         return ret ;
  13.   }
  14.   return ret ;
  15. }

  16. int main ( int c , char **v )
  17. {

  18.  for ( int i = 0 ; i < 10 ; i++ )
  19.  {
  20.   int sock_fd = getSocketDone () ;
  21.   printf ("\n here is the sock_fd %d\n", sock_fd) ;

  22.    close ( sock_fd ) ;
  23.  }
  24.   return 0 ;
  25. }

阅读(926) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~