AF_INET与套接字

转载 2015年07月08日 10:05:54

创建套接字的函数是socket(),函数原型为:

  #include <sys/types.h>
  #include <sys/socket.h>
     int socket(int domain, int type, int protocol);

    其中“int domain”参数表示套接字要使用的协议簇,协议簇的在“linux/socket.h”里有详细定义,常用的协议簇:

  • AF_UNIX(本机通信)
  • AF_INET(TCP/IP – IPv4)
  • AF_INET6(TCP/IP – IPv6)

  其中“type”参数指的是套接字类型,常用的类型有:

  • SOCK_STREAM(TCP流)
  • SOCK_DGRAM(UDP数据报)
  • SOCK_RAW(原始套接字)  

   最后一个“protocol”一般设置为“0”,也就是当确定套接字使用的协议簇和类型时,这个参数的值就为0,但是有时候创建原始套接字时,并不知道要使用的协议簇和类型,也就是domain参数未知情况下,这时protocol这个参数就起作用了,它可以确定协议的种类。

   socket是一个函数,那么它也有返回值,当套接字创建成功时,返回套接字,失败返回“-1”,错误代码则写入“errno”中。

创建套接字:

   #include <sys/types.h>
   #include <sys/socket.h>
   #include <linux/socket.h>
     int sock_fd_tcp;
     int sock_fd_udp;
     sock_fd_tcp = socket(AF_INET, SOCK_STREAM, 0);
     sock_fd_udp = socket(AF_INET, SOCK_DGRAM, 0);
     if(sock_fd_tcp < 0){
          perror("TCP SOCKET ERROR!\n");
          exit(-1);
     }
 
     if(sock_fd_udp < 0){
          perror("UDP SOCKET ERROR!\n");
          exit(-1);
     }

什么是Socket?举一个例子:Lewis跟Nico两人聊QQ,QQ是一个独立的应用程序,那么它对应了两个Socket,一个在Lewis的电脑上,一个在Nico的电脑上。当Lewis对Nico说:”周末我们去开卡丁车吧!“,这句话就是一段数据,这段数据会先储存在Lewis电脑Socket上,我们在”分层网络模型“一文中提到过,TCP存在于传输层,同时,我们在”端口、IP协议“一文中又提到了TCP传输过程(三次握手建立连接,三次握手关闭连接),当Lewis的QQ和Nico的QQ连接成功后,Lewis的Socket将这段话的数据发送到Nico的电脑中,但是Nico暂时还没看到,因为数据会先存放在Nico电脑的Socket当中,然后Socket会把数据呈现给Nico看。

   到了这里不禁要问,数据传送过程中为什么要多出Socket这样东西?

   答:因为不同的应用程序对应不同的Socket,而Socket保证了QQ的数据不会到处乱跑,不会一冲动跑到MSN上去了。因为QQ和MSN两个应用程序的Socket内容是完全不同的。那么Socket里面到底是什么?

   答:Socket套接字地址!套接字地址是一个数据结构,我们仅基于TCP传输协议作为例子。套接字地址这个数据结构里面包含了:地址类型、端口号、IP地址、填充字节这4种数据。而它的数据结构原型为:

   #include <netinet/in.h>
    struct sockaddr_in{
     unsigned short         sin_family;    
     unsigned short int     sin_port;      
     struct in_addr         sin_addr;      
     unsigned char          sin_zero[8];   
  };

其中:

  • sin_family表示地址类型,对于基于TCP/IP传输协议的通信,该值只能是AF_INET;
  • sin_prot表示端口号,例如:21 或者 80 或者 27015,总之在0 ~ 65535之间;
  • sin_addr表示32位的IP地址,例如:192.168.1.5 或 202.96.134.133;
  • sin_zero表示填充字节,一般情况下该值为0;

Socket数据的赋值实例:

  struct sockaddr_in Lewis;
  Lewis.sin_family      = AF_INET;
  Lewis.sin_port        = htons(80);
  Lewis.sin_addr.s_addr = inet_addr("202.96.134.133");
  memset(Lewis.sin_zero,0,sizeof(Lewis.sin_zero));

分析:我们设置了一个名叫Lewis的套接字地址,它基于TCP/IP协议,因此sin_family的值为AF_INET,这个是雷打不动的,只要使用TCP/IP协议簇,该值就是AF_INET;htons是端口函数,以后介绍,这就表示设置了端口号为80;

sin_addr是一个数据结构,原型是:

  struct in_addr{
     unsigned long     s_addr;
};

  因此,Lewis这个套接字地址的IP赋值格式是Lewis.sin_addr.s_addr,inet_addr函数也是日后再说,这里表示设置IP地址为202.96.134.133;而memset函数在这里起到给sin_zero数组清零的作用,它的原型是:

  memset(void *s, int c, size_t n);


python socket编程详细介绍

Python 提供了两个基本的 socket 模块。    第一个是 Socket,它提供了标准的 BSD Sockets API。    第二个是 SocketServer, 它提供了服...
  • rebelqsp
  • rebelqsp
  • 2014年03月25日 23:21
  • 129737

AF_INET域与AF_UNIX域socket通信原理对比

1.  AF_INET域socket通信过程 典型的TCP/IP四层模型的通信过程。 发送方、接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口...
  • sandware
  • sandware
  • 2014年11月08日 18:46
  • 6100

有关socket AF_UNIX的一点心得

转自:http://blog.csdn.net/yuxi2046/article/details/6996105 socket=socket.socket(family, type)  famil...
  • ccwwff
  • ccwwff
  • 2015年05月13日 15:02
  • 10668

socket 的理解

1. socket 网络编程的理解 2. python 实现最简单的聊天程序 server.py #!/usr/bin/python import socket, traceback, sys ...
  • caoshuming_500
  • caoshuming_500
  • 2016年02月01日 16:00
  • 2159

关于PF_INET和AF_INET的区别

理论上建立socket时是指定协议,应该用PF_xxxx,设置地址时应该用AF_xxxx。当然AF_INET和PF_INET的值是相同的,混用也不会有太大的问题。也就是说你socket时候用PF_xx...
  • jin13277480598
  • jin13277480598
  • 2016年12月23日 18:05
  • 4466

socket()函数介绍

socket()函数介绍 socket函数介绍 函数原型 domain type protocol errno 示例
  • xc_tsao
  • xc_tsao
  • 2015年03月08日 10:46
  • 11605

C语言的Socket编程例子(TCP和UDP)

server端: #include "stdafx.h" #include #include #pragma comment(lib,"ws2_32.lib") int main(int ar...
  • chinazhd
  • chinazhd
  • 2015年04月19日 23:15
  • 57741

Socket_编程_参考

Socket 编程 参考 UNP 第一卷 chinaunix 论坛 一、 基本知识 主机字节序和网络字节序 主机字节序即内存中存储字节的方法有: 1. Little endian:将低序...
  • a925907195
  • a925907195
  • 2014年09月19日 14:04
  • 1404

socket网络编程

  • 2010年01月27日 13:47
  • 11.23MB
  • 下载

一起talk C栗子吧(第一百五十九回:C语言实例--基于AF_INET域的数据报套接字通信)

各位看官们,大家好,上一回中咱们说的是基于AF_INET域的流套接字通信的例子,这一回咱们说的例子是:基于AF_INET域的数据报套接字通信 。闲话休提,言归正转。让我们一起talk C栗子吧!...
  • talk_8
  • talk_8
  • 2016年05月30日 05:50
  • 3201
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AF_INET与套接字
举报原因:
原因补充:

(最多只允许输入30个字)