当前位置: 首页 > news >正文

Linux下的socket演示程序2

server.cpp

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define SER_PORT 8888   //服务器端口号
#define SER_IP "10.148.4.168"  //服务器IP地址

int main(int argc,const char*argv[]){

    //1、创建用于连接的套接字文件描述符
    int sfd=socket(AF_INET,SOCK_STREAM,0);
    //参数1:AF_INET表示使用的是ipv4的通信协议
    //参数2:SOCK_STREAM表示使用的是TCP通信
    //参数3:由于参数2指定了协议,参数3填0就行
    if(sfd==-1){
        perror("socket error!");
        return -1;
    }
    printf("socket success sfd = %d\n", sfd);

    //2、绑定ip地址和端口号
    //2.1填充要绑定的ip地址和端口号结构体
    struct sockaddr_in sin;
    sin.sin_family=AF_INET;  //通信域
    sin.sin_port=htons(SER_PORT);  //端口号
    sin.sin_addr.s_addr =inet_addr(SER_IP);  //IP地址
     
    //2.2绑定工作
    //参数1:要被绑定的套接字文件描述符
    //参数2:要绑定的地址信息结构体,需要进行强制类型转换,防止警告
    //参数3:参数2的大小
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
        perror("bind error!");
        return -1;
    }
    printf("bind success\n");

    //3、启动监听
    //参数1:要启动监听的文件描述符
    //参数2:挂起队列的长度
    if(listen(sfd,128)==-1){
        perror("listen error!");
        return -1;
    }
    printf("listen success\n");

    //4、阻塞等待客户端连接
    //定义变量,用于接受客户端地址信息的结构体
    struct sockaddr_in cin;  //用于接收地址信息的结构体
    socklen_t cin_len =sizeof(cin);  //用于接收地址的长度
    int newfd = accept(sfd,(struct sockaddr*)&cin,&cin_len);
    //参数1:服务器套接字文件描述符
    //参数2:用于接收客户端地址信息结构体的容器,如果不接收,也可以填NULL
    //参数3:接收参数2的大小,如果参数2为NULL,则参数3也是NULL
    if(newfd==-1){
        perror("accept error!");
        return -1;
    }
    printf("[%s:%d]:已连接成功!!!!\n", inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));

    //5、数据的收发
    char rbuf[128]="";//数据容器
    while(1){
        bzero(rbuf,sizeof(rbuf));  //清空容器里的内容

        //从套接字中获取信息
        int res =recv(newfd,rbuf,sizeof(rbuf),0);
        if(res==0){
            printf("对端已下线");
            break;
        }
        printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),rbuf);

        //对收到的数据处理一下,回给客户端
        strcat(rbuf,"*_*");

        //将消息发给客户端
        if(send(newfd,rbuf,strlen(rbuf),0)==-1){
            perror("send error!");
            return -1;
        }
        printf("发送成功\n");
    }

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

    printf("hello world");
    return 0;
}

client.cpp

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define SER_PORT 8888 //服务器端口号
#define SER_IP "10.148.4.168"  //服务器IP地址
#define CLI_PORT 9999  //客户端端口号
#define CLI_IP "10.148.4.168"  //客户端IP地址

int main(int argc,const char*argv[]){

    //1、创建用于通信的客户端套接字文件描述符
    int cfd =socket(AF_INET,SOCK_STREAM,0);
    if(cfd==-1){
        perror("socket error");
        return -1;
    }
    printf("socket success cfd = %d\n", cfd);

    //2、绑定ip地址和端口号(可选)
    //2.1 填充要绑定的地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family=AF_INET;
    cin.sin_port =htons(CLI_PORT);
    cin.sin_addr.s_addr =inet_addr(CLI_IP);
    //2.2绑定工作
    if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){
        perror("bind error!");
        return -1;
    }

    //3、连接服务器
    //3.1填充要连接的服务器地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family =AF_INET;  //通信域
    sin.sin_port =htons(SER_PORT);  //端口号
    sin.sin_addr.s_addr=inet_addr(SER_IP);  //服务器IP
    //3.2连接工作
    if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功!\n");

    //4、数据的收发
    char wbuf[128]="";
    while(1){
        bzero(wbuf,sizeof(wbuf));  //清空容器

        //从终端获取数据
        fgets(wbuf,sizeof(wbuf),stdin);
        wbuf[strlen(wbuf)-1]=0;  //将换行改为'\0'

        //将数据发给服务器
        if(send(cfd,wbuf,sizeof(wbuf),0)==-1){
            perror("send error");
            return -1;
        }

        //接收服务器发过来的消息
        if(recv(cfd,wbuf,sizeof(wbuf),0)==-1){
            printf("对端已下线");
            break;
        }

        printf("收到服务器消息为:%s\n", wbuf);

    }
    //5、关闭套接字
    close(cfd);
    printf("hello world\n");

    return 0;
}

相关文章:

  • 【Linux网络(七)】数据链路层
  • MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效
  • 一台电脑最多能接几个硬盘?
  • localhost 和 127.0.0.1 的区别
  • 图解AUTOSAR_SWS_FlashDriver
  • 5G核心网(5GC)开户中,DNN(Data Network Name,数据网络名称)
  • 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
  • Python 爬虫案例
  • Redis:String 类型 内部实现、编码、命令及应用场景
  • Java基础 3.27
  • C语言学习关键笔记
  • DeepSeek详解:探索下一代语言模型
  • 并查集(Union-Find Set)课程笔记
  • 【JavaScript】闭包笔记
  • Ubuntu 防火墙配置
  • 头条项目的文章延迟发布功能
  • pyqt环境搭建
  • 吐血教程:搭建Flutter开发环境
  • DQL语句-数据处理函数
  • Java 基本数据类型 vs 包装类(引用数据类型)
  • 网站 昆明/网站制作公司排名
  • 南昌哪里做网站好/新十条优化措施
  • 广告艺术设计学什么/宁波seo排名费用
  • 名站在线/seo顾问阿亮
  • 网站优化排名易下拉排名/网站排名大全
  • 网站怎么做免费推广/软文营销常用的方式是什么