• tcp 网络编程


    网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信。

    OSI:开放式系统互联

    OSI 7层模型:                                                                           4层模型

    1.应用层:talnet tftp等

    2.表示层:                                                                    应用层

    3.会话层

    4.传输层:tcp,udp等,可靠不可靠                                     传输层

    5.网络层:ip,负责把数据发送到另一台电脑                          网络层

    6.数据链路层

    7.物理层:ARP,RARP等,负责二进制的数据转化成光信号。      网络接口和物理层

    发送数据,7层模型从上到下,接收数据从下到上。

    层与层之间是透明的,互不关心对方的动作(每层都有固定的动作,称之为协议)。

    udp和tcp之间的关系:

    相同点:都为传输层协议

    不同点:udp:面向不连接,不可靠。tcp:面向连接,可靠。发送数据包后,未收到成功接收的应答,将会对数据包重新发送 。而udp不存在这种情况。

    socket的四个特点:

    1.它是一种特殊的I/O接口

    2.它是一种特殊的文件描述符

    3.它有两个缓冲区:读缓冲区和写缓冲区。

    4.有三种不同的类型:SOCKET_STREAM(流式套接字),SOCKET_DGRAM(数据报套接字),SOCKET_RAM(原始套接字)

    大端存储和小端存储(高字节存放于高地址,大端相反)。

    字节序转换:

    uint16_t htons(uint16_t hostshort); //将主机端口号转换成二进制大端存储。

    ip地址转换:

    int inet_aton(const char *cp, struct in_addr *inp); //将字符串IP地址转换为二进制,并将其大端存储在struct in_addr *inp的地址成员中

    in_addr_t inet_addr(const char *cp);//将字符串ip地址转换为二进制,函数返回地址存放于struct in_addr *inp 的地址成员中。

    socket里面的独一无二的port;

    几个关于地址的重要的结构体:

    struct sockaddr

    {

    u_short sa_family;

    char sa_data[14];

    }

    struct sockaddr_in

    {

    u_short sin_family;

    u_short sin_sin_port;

    struct in_addr sin_addr;

    char sin_zero[8];

    }

    struct in_addr

    {

    in_addr_t s_addr;

    };

    tcp服务器端编程:一个简单的即时通信程序

    #include<stdio.h>
    #include<netinet/in.h>
    #include<stdlib.h>
    #include<string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include<pthread.h>
    #include<strings.h>
    int newsocketfd;
    void *func(void*p)
    {
    
    char buf[20];
    while(strncmp(buf,"bye",3))
    {
    bzero(buf,20);
    if(recv(newsocketfd,buf,sizeof(buf),0)<0)//接收数据函数
    perror("recv() error!
    ");
    printf("%s
    ",buf);
    }
    
    
    }
    int main()
    {
    int socketfd = socket(PF_INET,SOCK_STREAM,0);//创建套接字,第一参数为地址族,第二个参数为socket类型,、、、、、、第1步
    struct sockaddr_in saddr;//使用这个结构体需要加上<netinet/in.h>这个头文件
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = PF_INET;对结构体初始化
    saddr.sin_port = htons(6000);//需要转换成大端存储
    saddr.sin_addr.s_addr = inet_addr("192.168.1.46");//同上,改地址为客户端地址
    
    if(bind(socketfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr_in))<0)//、、、、、、第二步,绑定端口
    perror("bind() error!
    ");
    
    if(listen(socketfd,5)<0)//、、、、第三步,侦听是否有连接请求,5表示同一时间只能接受5个连接请求。未处理的连接请求将会放到请求队列中(最多5个)
    perror("listen() error!
    ");
    struct sockaddr_in caddr;
    int s = sizeof(struct sockaddr);
    newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s);//第四步,处理请求,会得到客户端的ip地址和端口,然后返回一个和客户端相同的newsockfd(文件描述符)服务器通过这个与客户端通信。
    
    pthread_t pthreadid;
    pthread_create(&pthreadid,NULL,func,NULL);
    
    char buf[20];
    while(strncmp(buf,"bye",3))
    {    
    bzero(buf,20);
    scanf("%s",buf);    
    if(send(newsocketfd,buf,strlen(buf),0)<0)//、、、、、、第五步发送数据。
    perror("send() error!
    ");
    }    
    close(socketfd);//、、、、、、、、、、、、、、、、第六步,关闭文件描述符
    close(newsocketfd);
    
    }
    
     
    
    客户端程序:
    
    #include<stdio.h>
    #include<pthread.h>
    #include<netinet/in.h>
    #include<stdlib.h>
    #include<string.h>
    #include<strings.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    int socketfd;
    void *func(void*p)
    {
    char buf[20];
    while(strncmp(buf,"bye",3))
    {
    bzero(buf,20);
    int nrecv;
    if(nrecv = recv(socketfd,buf,sizeof(buf),0)<0)
    perror("recv() error!
    ");
    printf("%s
    ",buf);
    
    }
    
    
    }
    int main()
    {
    socketfd = socket(PF_INET,SOCK_STREAM,0);//、、、、、、、、、、、、、第一步创建套接字
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = PF_INET;
    saddr.sin_port = htons(6000);//编程可用端口4000-600000
    saddr.sin_addr.s_addr = inet_addr("192.168.1.46");//该地址为服务器端地址
    
    if(connect(socketfd,(struct sockaddr *)&saddr,sizeof(struct sockaddr))<0)//、、、、、、、、、、第二步发送连接请求
    
    perror("connect() error!
    ");
    pthread_t pthreadid;
    pthread_create(&pthreadid,NULL,func,NULL);
    char buf[20];
    while(strncmp(buf,"bye",3))
    {
    bzero(buf,20);
    scanf("%s",buf);
    if(send(socketfd,buf,strlen(buf),0)<0)//、、、、、、、、、、、第三步读写数据
    perror("send() error!
    ");
    }
    close(socketfd);//、、、、、、、、、、、、、、、第四步,关闭文件描述符。
    
    }
  • 相关阅读:
    《作业二》总结
    《作业一》总结
    团队项目-需求分析报告
    团队项目-选题报告
    第一次结对编程作业
    第一次个人编程作业
    第一次博客作业
    第12组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
  • 原文地址:https://www.cnblogs.com/defen/p/5251664.html
Copyright © 2020-2023  润新知