文档章节

socket结构体

小绿豆蛙
 小绿豆蛙
发布于 2014/06/24 15:10
字数 582
阅读 7
收藏 0

Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。
  struct sockaddr结构类型是用来保存socket信息的:
  struct sockaddr {
   unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */
};

struct in_addr其实就是32位IP地址
struct in_addr {
        unsigned long s_addr;
};

sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。 另外还有一种结构类型:
struct sockaddr_in {
    short int sin_family; /* 地址族 */
    unsigned short int sin_port; /* 端口号 */ 
    struct in_addr sin_addr; /* IP地址 */
    unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */
};
   这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到与struct  sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向sockaddr_in  的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向 sockaddr_in的指针转换为指向sockaddr的指针;或者相反。

#include <sys/un.h>

 #define UNIX_PATH_MAX 108

  struct sockaddr_un {
  sa_family_t sun_family; /*PF_UNIX或AF_UNIX */
  char sun_path[UNIX_PATH_MAX]; /* 路径名 */
  };

UNIX域结构体定义,关于AF_INET和PF_INET:AF = Address Family  PF = Protocol Family

在Linux中如果是BSD就是AF,如果是POSIX就是PF相互混淆也没有太大问题

在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET. 这几个参数有AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET. 但是对于socketpair与socket的domain参数,使用PF_LOCAL系列, 而在初始化套接口地址结构时,则使用AF_LOCAL. 例如:     z = socket(PF_LOCAL, SOCK_STREAM, 0);     adr_unix.sin_family = AF_LOCAL;

程序例子:SERVER.C

            ....................

    struct sockaddr_un address;
    int sock, conn;
    size_t addrLength;

    if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
        die("socket");

    /* Remove any preexisting socket (or other file) */
    unlink("./sample-socket");

    address.sun_family = AF_UNIX;       /* Unix domain socket */
    strcpy(address.sun_path, "./sample-socket");

    /* The total length of the address includes the sun_family
       element */
    addrLength = sizeof(address.sun_family) +
                 strlen(address.sun_path);

    if (bind(sock, (struct sockaddr *) &address, addrLength))
        die("bind");

    if (listen(sock, 5))
        die("listen");

    while ((conn = accept(sock, (struct sockaddr *) &address,
                          &addrLength)) >= 0) {
        printf("---- getting data\n");
        copyData(conn, 1);
        printf("---- done\n");
        close(conn);
    }

CLIENT.C

..........

struct sockaddr_un address;
    int sock;
    size_t addrLength;

    if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
        die("socket");

    address.sun_family = AF_UNIX;    /* Unix domain socket */
    strcpy(address.sun_path, "./sample-socket");

    /* The total length of the address includes the sun_family
       element */
    addrLength = sizeof(address.sun_family) +
                 strlen(address.sun_path);

    if (connect(sock, (struct sockaddr *) &address, addrLength))
        die("connect");

copy from many blogs here!





© 著作权归作者所有

共有 人打赏支持
小绿豆蛙
粉丝 0
博文 33
码字总数 13280
作品 0
海淀
程序员
由socket的accept说开去

今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自己虽然熟...

乐搏学院
2016/12/12
2
0
socket的accept函数解析

今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自己虽然熟...

lxtiantian
2016/12/07
12
0
完成端口中的单句柄数据结构与单IO数据结构的理解与设计

完成端口中的单句柄数据结构与单IO数据结构的理解与设计   完成端口模型,针对于WIN平台的其它异步网络模型而言,最大的好处,除了性能方面的卓越外,还在于完成端口在传递网络事件的通知时...

IMGTN
2012/11/28
0
0
c/c++通过socket发送结构体

c/c++通过socket发送结构可以直接先将结构转化到内存中,再通过send直接发送。 在网络通讯过程中往往涉及一些有关联的参数传递,例如数组,结构体之类的。对于结构体其实方法挺简单,由于结构...

扶殊88
2011/12/08
0
0
linux 高性能读书笔记之通用socket地址

####socket网络编程接口 socket的地址是结构体sockaddr 代码如下 struct sockaddr{ safamilyt safamily; char sadata[14]; } sa_family 成员是地址族类型(sa_family_t)变量。 地址族类型通常...

jackdongting
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
38分钟前
0
0
Confluence 6 数据库和临时目录

数据库 所有的其他数据库,包括有页面,内容都存储在数据库中。如果你安装的 Confluence 是用于评估或者你选择使用的是 Embedded H2 Database 数据库。数据库有关的文件将会存储在 database...

honeymose
53分钟前
1
0
day62-20180820-流利阅读笔记

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
今天
0
0
分布式锁实现及对比

一、问题介绍 日常工作中很多场景下需要用到分布式锁,例如:任务运行(多个节点同一时刻同一个任务只能在一个节点上运行(分片任务除外)),交易接受(前端交易请求发送时,可能由于两次提...

yangjianzhou
今天
6
0
【AI实战】快速掌握TensorFlow(二):计算图、会话

在前面的文章中,我们已经完成了AI基础环境的搭建(见文章:Ubuntu + Anaconda + TensorFlow + GPU + PyCharm搭建AI基础环境),以及初步了解了TensorFlow的特点和基本操作(见文章:快速掌握...

雪饼
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部