嵌入式小白学习——网络编程篇

IP地址

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。接入互联网的主机都有它唯一的IP地址。

端口号

所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。

端口又分为逻辑端口物理端口。

物理端口

是用于连接物理设备直接的端口,如ADSL Modem、集线器、交换机、路由器上用于连接其他网络设备的接口,如RJ-45端口、SC端口等等 。

逻辑端口

是指逻辑意义上用于区分服务的端口,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。如TCP/IP协议中的服务端口,通过不同的逻辑端口来区分不同的服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口 。端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535。

Socket套接字

使用的一般是TCP或UDP协议。要注意他们之间的区别

TCP和UDP的区别

Socket服务器客户端开发步骤

Linux提供的API解析

第一步:创建套接字

第二步:准备好地址

地址转换成API:在服务器中不能直接识别字符串,需要将字符串转换为网络可以识别的格式。

第三步:监听,服务器端搭建好,就开始监听客户端发来的数据,根据发来的数据服务器返回给客户端所需要的数据,只能够用于服务端,

第四步:连接。当客户端调用connect时,服务器调用accept来接收,

数据收发

客户端的connet函数

编程实现:

寻找sockaddr_in下面有哪些结构的步骤

1.输入命令

2.搜索命令行

输入命令 grep "struct sockaddr_in {" * -nir

星号表示在当前目录底下,n:显示行号 i:不区分大小写

这种搜索方式可以搜到它定义的地方,

字节序转API

实验代码

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
//chenlichen
int main(int argc, char **argv)
{
    int s_fd;
    int c_fd;
    int n_read;
    char readBuf[128];
    
    int mark = 0;
    char msg[128] = {0};
    //    char *msg = "I get your connect";
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;

    if(argc != 3){
        printf("param is not good\n");
        exit(-1);
    }

    memset(&s_addr,0,sizeof(struct sockaddr_in));
    memset(&c_addr,0,sizeof(struct sockaddr_in));

    //1. socket  要用man 2 socket 找到所需的头文件
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(s_fd == -1){
        perror("socket");
        exit(-1);
    }

    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(atoi(argv[2]));
    inet_aton(argv[1],&s_addr.sin_addr);


    //2. bind
    bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

    //3. listen
    listen(s_fd,10);
    //4. accept
    int clen = sizeof(struct sockaddr_in);
    while(1){

        c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
        if(c_fd == -1){
            perror("accept");
        }

        mark++;
        printf("get connect: %s\n",inet_ntoa(c_addr.sin_addr));
    
        if(fork() == 0){

            if(fork()==0){
                while(1){
                    sprintf(msg,"welcom No.%d client",mark);
                    write(c_fd,msg,strlen(msg));
                    sleep(3);
                }    
            }    

            //5. read
            while(1){
                memset(readBuf,0,sizeof(readBuf));
                n_read = read(c_fd, readBuf, 128);
                if(n_read == -1){
                    perror("read");
                }else if(n_read>0){
                    printf("\nget: %d\n",n_read);
                }else{
                    
                    printf("client quit\n");
                    break;
                }
            }
            break;
        }

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值