linux网络设备应用与驱动编程学习笔记(1)——应用编程(套接字)

想搞清楚一个陌生的东西是怎么一回事,真的不容易!有点像武侠小说中,想炼成绝世武功要闭关修炼一样。

一、socket套接字简介

客户端与服务器都围绕着通信端点的概念,即套接字。使用套接字要将客户和服务器分开来。

一个套接字通过使用socket()函数惟一确定了一个端点。该端点的细节可以进一步由connnect()或bin()函数定义。最终,客户端定义的端点将与服务器定义的端点进行连

接和通信。

使用UDP和TCP时,端点就是本地或远程IP地址与端口的组合。socket广泛用在网络编程中,使用socket有固定的流程。

二、一个简单的使用流程

服务器端

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <sys/un.h>

#include <unistd.h>

#include <stdlib.h>

 

int main()

{

    int server_sockfd, client_sockfd;

    int server_len, client_len;

    struct sockaddr_un server_address;

    struct sockaddr_un client_address;

/*  Remove any old socket and create an unnamed socket for the server.  */

    unlink("server_socket");

    server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

/*  Name the socket.  */

    server_address.sun_family = AF_UNIX;

    strcpy(server_address.sun_path, "server_socket");

    server_len = sizeof(server_address);

    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

/*  Create a connection queue and wait for clients.  */

    listen(server_sockfd, 5);

    while(1) {

        char ch;

        printf("server waiting\n");

/*  Accept a connection.  */

        client_len = sizeof(client_address);

        client_sockfd = accept(server_sockfd,

            (struct sockaddr *)&client_address, &client_len);

/*  We can now read/write to client on client_sockfd.  */

        read(client_sockfd, &ch, 1);

        ch++;

        write(client_sockfd, &ch, 1);

        close(client_sockfd);

    }

}

总结:1.调用socket()函数创建未命名套接字

    2.初始化sockaddr_un结构来定义自己的地址格式

    3.调用blind()将求命名套接字变成命名套接字

    4.调用listen()创建一个连接队列等待客户连接

    5.调用accept()接受一个连接

    6.对客户套接字进行读写操作

    7.关闭套接字

客户端

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <sys/un.h>

#include <unistd.h>

#include <stdlib.h>

 

int main()

{

    int sockfd;

    int len;

    struct sockaddr_un address;

    int result;

    char ch = 'A';

/*  Create a socket for the client.  */

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

/*  Name the socket, as agreed with the server.  */

 

    address.sun_family = AF_UNIX;

    strcpy(address.sun_path, "server_socket");

    len = sizeof(address);

/*  Now connect our socket to the server's socket.  */

    result = connect(sockfd, (struct sockaddr *)&address, len);

    if(result == -1) {

        perror("oops: client1");

        exit(1);

    }

/*  We can now read/write via sockfd.  */

    write(sockfd, &ch, 1);

    read(sockfd, &ch, 1);

    printf("char from server = %c\n", ch);

    close(sockfd);

    exit(0);

}

       总结:1.调用socket()函数创建未命名套接字

    2.初始化sockaddr_un结构来定义自己的地址格式

       3.调用connect()连接服务器套接字

    4.对客户套接字进行读写操作

    5.关闭套接字

三、一些细节

以上程序使用的是文件系统套接字。还有用于tcp/ip网络通信的网络套接字。它们用法类似。

主机字节和网络字节序

unsigned long int htonl(unsigned long int hostlong);

unsigned long int htons(unsigned short int hostshort);

unsigned long int ntohl(unsigned long int netlong);

unsigned long int ntohs(unsigned short int netshort);

获取网络信息

struct hostent *gethostbyaddr(const void *addr,size_t len,int type);

struct hostent *gethostbyname(const char *name);

struct servent *getservbyname(const char *name,const char *proto);

struct servetn *getservbyport(int port,const char *proto);

因特网守护进程xinetd.UNIX系统通常以超级服务器的方式来提供多项网络服务。监听许多端口地址上的连接。当有客户连接到某项服务时,守护程序就运行相应有服务器。这样可以让各项服务器按需启动。

当客户需要发送一个短小的查询请求服务器时,并且期望接收到一个生龙活虎的响应时,我们一般使用udp提供的服务。使用网络套接字编程时不需要调用connect()函数。

其它操作函数

 int sendto(int sockfd,void *buffer,size_t len,int flags,struct sockaddr *to ,socklen_t tolen);

int recvfrom(int sockfd,void *buffer,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值