1. 套接口简介

参考书目: 《实战Linux Socket 编程》 Warren W.Gay 著 詹俊鹄 于卫 译 西安电子科技大学出版社

                       UNIX 网络编程  第一卷:套接口API (3rd) BILL FENNER 等著  杨继张译   清华大学出版社

 

Linux中的套接口于电话相似。套接字代表通信线路中的端点,端点之间就是数据通信网络。套接口于电话的相似行还体现在,当你给某人打电话时,拨叫的是对方的电话号码。套接字中的网络地址相当于电话号码。通过指定远程套接口的地址,就可以建立从本地到远程的套接口的通信。


*创建套接口

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>

int
main(void)
{
        int z;/* 返回状态码*/
        int s[2]; /* 套接口对 */
        /*
        * 生成本地套接口对
        */
        z = socketpair (AF_LOCAL, SOCK_STREAM, 0, s);

        if (z == -1){
                fprintf(stderr, "%s:socketpair", strerror(errno));
                return 1;/* 失败 */
        }

        /*打印返回的套接口描述符 */
        printf("s[0] = %d; /n", s[0]);
        printf("s[1] = %d: /n", s[1]);

        system("netstat -p | more ");

        return 0;
}

 

*用套接口实现 I/O


我们可以像读写一个已经打开的文件一样读写套接口。

用到的函数:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd,const void *buf, size_t count);

int close(int fd);

 

 

//例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
int
main(void)
{
        int z;/* 返回状态码*/
        int s[2]; /* 套接口对 */
        char* cp = NULL; /* 工作指针*/
        char buf[80]; /* 接收缓冲区 */
        /*
        * 生成本地套接口对
        */
        z = socketpair (AF_LOCAL, SOCK_STREAM, 0, s);

        if (z == -1){
                fprintf(stderr, "%s:socketpair", strerror(errno));
                return 1;/* 失败 */
        }

        /*打印返回的套接口描述符 */
        //printf("s[0] = %d; /n", s[0]);
        //printf("s[1] = %d: /n", s[1]);

        //system("netstat -p | more ");

        /* 向套接口 s[1] 写入消息 */
        z = write(s[1], cp="你好!",sizeof(cp));
        if (z < 0){
                fprintf(stderr, "s[1] write error :%d", strerror(errno));
                return -1;
        }
        printf ("Wrote message /'%s/' on s[1]/n", cp);

        /* 从套接口s[0]读取消息 */
        z = read(s[0], buf, sizeof(buf));
        if (z<0){
                fprintf(stderr, "read s[0] error: %s", strerror(errno));
                return -2;
        }

        buf[z] = 0;/*NULL 终止符*/
        printf("/tReceived message :%s  from socket s[0]. /n");

        /* 从 s[0] 向 s[1] 发送消息 */
        z = write(s[0], cp="不好!", sizeof(cp));
        if (z < 0){
                fprintf(stderr, "write s[0] error: %s",strerror(errno));
                return -3;
        }

        printf("s[1] wote message: %s on s[0] /n", cp);

 /* 从套接口 s[1] 读出应答消息 */
        z = read(s[1], buf, sizeof(buf));
        buf[z] = 0;/* NULL 终结符*/
        if (z < 0 ){
                fprintf(stderr, " read  s[1] error: %s/n", strerror(errno));
                return -4;
        }

        /* 报告s[0] 从 s[1] 中读出的消息 */
        printf("/t s[0] received message %s from socket s[1]/n", buf);

        /* 关闭套接口 */
        close(s[0]);
        close(s[1]);

        printf("Done./n");

        return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值