socket演示程序2

发布于:2025-03-31 ⋅ 阅读:(62) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到