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;
}

 

你可能感兴趣的:(linux,Stream,socket,网络,null,电话)