day2 网络

2023-12-23 03:40:50

1.TCP服务端通信模型

#include <head.h>

#define PORT 9999
#define IP "192.168.125.14"

int main(int argc,const char *argv[])
{
    //1、创建套接字
    int sfd = -1;

    //创建支持TCP通信套接字
    //AF_INET:跨主机 IPv4;
    if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror("socket error");
        return -1;
    }
    printf("%d\n",sfd);


    //2绑定地址信息结构体
    //2.1填充地质信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    //2.2绑定工作
    if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
    {
        perror("error");
        return -1;
    }
    printf("bind success_%d_%s_%s\n",__LINE__,__FILE__,__func__);

    //3.设置监听,不再用于通信,内核维护两队列已连接队列和为连接
    if(listen(sfd,128)==-1)
    {
        perror("listen error");
        return -1;
    }
    printf("listen success_%d_%s_%s\n",__LINE__,__FILE__,__func__);


    int nsfd=-1;
    //接受客户端地址信息结构体
    struct sockaddr_in cin;
    socklen_t socklen = sizeof(cin);
    //4接受请求,请求连接成功时会返回一个新的套接字文件描述符,用于通信。
    if((nsfd=accept(sfd,(struct sockaddr *)&cin,&socklen))==-1)
    {
        perror("acceot error");
        return -1;
    }
     printf("[%s:%d] 连接成功,nsfd = %d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),nsfd);
    char buf[128]="";
    //5接受数据
     while(1)
     {
        bzero(buf,sizeof(buf));
        int res = recv(nsfd,buf,sizeof(buf),0);
        printf("收到客户端消息:%s\n",buf);
        
        strcat(buf,"*-*");
        send(nsfd,buf,sizeof(buf),0);

     }
    
    //6关闭nsfd,服务端不再是监听状态。
    close(nsfd);
    //6关闭
    close(sfd);
}

2.TCP客户端通信模型

#include<head.h>
#define PORT 9999                  //服务器端口号
#define IP "192.168.125.14"        //服务器IP地址

#define CIP "192.168.125.14"  //客户端
#define CPORT 6666
int main(int argc, const char *argv[]) 
{
    //1、创建套接字
    int cfd = -1;
    if((cfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket error");
        return -1;
    }

    printf("sfd = %d\n", cfd);           //?

    //2、绑定地址信息结构体(必须)
    //2.1 填充地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family =     AF_INET;   //地址族为IPv4
    cin.sin_port =         htons(CPORT);    //端口号,需要转换网络字节序
    cin.sin_addr.s_addr = inet_addr(CIP);  //IP地址

    //2.2绑定工作
    if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //3请求服务器连接
    //3.1定义地址信息的结构体变量
    struct sockaddr_in sin;
    sin.sin_family =     AF_INET;   //地址族为IPv4
    sin.sin_port =         htons(PORT);    //端口号,需要转换网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);  //IP地址             
    
    if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
    {
        perror("connect error");
        return -1;
    }
    //4、收发数据
    char rbuf[128] = "";    //读取消息的容器
    while(1)
    {
        bzero(rbuf, sizeof(rbuf));
        fgets(rbuf,sizeof(rbuf),stdin);
        rbuf[strlen(rbuf)-1]=0;
        //发送
        send(cfd,rbuf,sizeof(rbuf),0);

        //接收服务器回信
        bzero(rbuf, sizeof(rbuf));
        recv(cfd,rbuf,sizeof(rbuf),0);
        printf("收到服务器:%s\n",rbuf);
    
    }
    //关闭
    close(cfd);
    return 0;
}

3.UDP服务器通信模型

#include<head.h>
#define PORT 9999                  //端口号
#define IP "192.168.125.14"        //IP地址


int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = -1;
    if((sfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        perror("socket error");
        return -1;
    }

    //端口号快速重用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
    {
        perror("setsockopt error");
        return -1;
    }


    //2、绑定IP和端口号(必须)
    //2.1 填充地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);
    //2.2 绑定
    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //3、收发数据
    char buf[128] = "";

    //定义接收客户端地址信息的结构体
    struct sockaddr_in cin;
    socklen_t socklen = sizeof(cin);        //套接字的长度

    while(1)
    {
        bzero(buf,sizeof(buf));
        recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &socklen);
        printf("[%s:%d]: %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

        //回给客户端
        strcat(buf, "*_*");
        //write(sfd, buf, sizeof(buf));
        sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin));

        printf("发送成功\n");
    }

    //4、关闭套接字
    close(sfd);

    return 0;
}

4.UDP客户端通信模型

#include<head.h>
#define PORT 9999                  //端口号
#define IP "192.168.125.14"        //IP地址

#define CIP "192.168.125.14"
#define CPORT 6666
int main(int argc, const char *argv[])
{
    //1、创建套接字
    int cfd = -1;
    if((cfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        perror("socket error");
        return -1;
    }

    //端口号快速重用
    int reuse = 1;
    if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
    {
        perror("setsockopt error");
        return -1;
    }


    //2、绑定IP和端口号(非必须)
    //2.1 填充地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(CPORT);
    cin.sin_addr.s_addr = inet_addr(CIP);
    //2.2 绑定
    if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //3、收发数据
    char buf[128] = "";

    //定义接收客户端地址信息的结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    while(1)
    {
        bzero(buf, sizeof(buf));
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]=0;
        //发送
        sendto(cfd,buf,sizeof(buf),0,(struct sockaddr *)&sin,sizeof(sin));

        recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);
        printf("buf = %s\n", buf);
    }

    //4、关闭套接字
    close(cfd);

    return 0;
}

文章来源:https://blog.csdn.net/Aklkimg/article/details/135091605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。