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

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;
}

相关文章:

  • xshell可以ssh连接,但vscode不行
  • 多路IO复用-----epoll和poll和select的区别
  • Windows系统本地部署DeepSeek详细教程
  • Ubuntu修改用户名
  • 朴素贝叶斯
  • AI人工智能-Python基础与程序流程控制
  • python正向先行断言讲解与举例
  • Javascript中的匿名函数
  • 基于单片机的农田智能驱鼠装置(论文+源码)
  • 第十七章:Python数据可视化工工具-Pyecharts库
  • Qt中的事件循环
  • “Error: Flash Download failed - Target DLL has been cancelled”
  • todesk控制端没声音 控制声音位置
  • 吴恩达深度学习复盘(2)神经网络的基本原理轮廓
  • ACM第二次排名赛
  • Java进阶——原生定时器
  • Python 爬虫(5)Beautiful Soup 4 实战
  • 数字隔离器选型与设计
  • 通过安当TDE透明加密实现ClickHouse数据库安全加密存储
  • 从失衡到平衡:手撕红黑树的插入旋转操作
  • 没有网站域名备案信息吗/营销平台建设
  • 南充做网站 www.xinbay.com/营销型网站制作公司
  • 怎么申请网站空间域名/湖南网站优化
  • 做网站建设的销售怎么样/百度购物平台客服电话
  • 制作一个网址需要多少钱/西安自动seo
  • 网站页面尺寸/长沙网络营销顾问