文档章节

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!





© 著作权归作者所有

共有 人打赏支持
上一篇: su root认证失败
下一篇: linux的send和recv
小绿豆蛙
粉丝 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
linux 高性能读书笔记之通用socket地址

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

jackdongting
06/29
0
0
[技术分享] NSRC技术分享——自制Linux Rootkit检测工具

Linux系统中存在用户态与内核态,当用户态的进程需要申请某些系统资源时便会发起系统调用。而内核态如何将系统的相关信息实时反馈给用户态呢,便是通过proc文件系统。如此便营造了一个相对隔...

i春秋学院
2017/07/18
175
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
13
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部