网络编程——聊天程序实现

1、UDP实现

服务器端:

cpp 复制代码
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> 
#include <time.h>
#include <unistd.h>
#include<pthread.h>
typedef struct sockaddr *(SA);
//th函数是一个线程函数,负责持续接收来自客户端的消息
void* th(void* arg)
{
    int fd=*(int*)arg;
    char buf[512];
    while (1)
    {
        recvfrom(fd, buf, sizeof(buf), 0, NULL,NULL);
        if(strcmp(buf, "#quit")==0)
        {
            printf("client has left\n");
            exit(0);
        }
        printf("Me:%s\n",buf);
    }
    return NULL;
}
int main()
{
//1创建UDP套接字
    int udpfd=socket(AF_INET, SOCK_DGRAM, 0);
    if(-1==udpfd)
    {
        perror("socket");
        return 1;
    }
//2设置服务器地址
    struct sockaddr_in ser,cli;
    bzero(&ser, sizeof(ser));
    bzero(&cli, sizeof(cli));
    ser.sin_family=AF_INET;
    ser.sin_port=htons(50000);
    ser.sin_addr.s_addr=inet_addr("192.168.31.86");
//3绑定套接字
    int ret=bind(udpfd, (SA)&ser, sizeof(ser));
    if(-1==ret)
    {
        perror("bind");
        return 1;
    }
//4等待客户端连接
    char buf[512];
    socklen_t len=sizeof(cli);
    recvfrom(udpfd, buf, sizeof(buf), 0, (SA)&cli, &len);
//5创建接收线程
    pthread_t tid;
    pthread_create(&tid,NULL,th,&udpfd);
//6主线程循环发送消息给客户端
    printf("You:");
    while (1)
    {
        fgets(buf, sizeof(buf), stdin);
        sendto(udpfd, buf, sizeof(buf), 0, (SA)&cli, len);
        if(0==strcmp("#quit", buf))
        {
            exit(0);
        }
        printf("You:");
    }
//清理工作
    pthread_join(tid1, NULL);
    close(udpfd);
    return 0;
}

客户端:

cpp 复制代码
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> 
#include <time.h>
#include <unistd.h>
#include<pthread.h>
typedef struct sockaddr *(SA);
//th函数是一个线程函数,负责持续接收来自服务器的消息
void* th1(void* arg)
{
    int fd=*(int*)arg;
    while (1)
    {
        char buf[128]={0};
        recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
        if(strcmp(buf, "#quit")==0)
        {
            printf("server has left\n");
            exit(0);
        }
        printf("You:%s\n",buf);
    }
    return NULL;
}

int main()
{
//1创建UDP套接字
    int udpfd=socket(AF_INET, SOCK_DGRAM, 0);
    if(-1==udpfd)
    {
        perror("socket");
        return 1;
    }
//2设置服务器地址
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family=AF_INET;
    ser.sin_port=htons(50000);
    ser.sin_addr.s_addr=inet_addr("192.168.31.86");
//3发送消息建立初始链接
    char buf[512]="start";
    sendto(udpfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));
//4创建接收线程
    pthread_t tid1,tid2;
    pthread_create(&tid1,NULL,th1,&udpfd);
//5主线程循环发送消息到服务器
    printf("You:");
    while (1)
    {
        char buf[512];
        fgets(buf, sizeof(buf), stdin);
        sendto(udpfd, buf, sizeof(buf), 0, (SA)&ser, sizeof(ser));
        if(0==strcmp("#quit", buf))
        {
            exit(0);
        }
        printf("You:");
    }
//清理工作
    pthread_join(tid1, NULL);
    close(udpfd);
    return 0;
}

2、TCP实现

服务器端:

cpp 复制代码
#include<netinet/in.h>
#include<netinet/ip.h>
#include <pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <strings.h>
#include<sys/socket.h>
#include<sys/types.h>
#include <thread_db.h>
#include<time.h>
#include<unistd.h>
typedef struct sockaddr*(SA);
//th函数是一个线程函数,负责持续接收来自客户端的消息
void *th(void *arg)
{
    int fd=*(int*)arg;
    char buf[512];
    while (1)
    {
        recv(fd, buf, sizeof(buf), 0);
        if(strcmp("#quit\n",buf)==0)
        {
            exit(0);
        }
        printf("You:%s",buf);
    }
    return NULL;
}
int main()
{
//1创建TCP监听套接字
    int listfd=socket(AF_INET, SOCK_STREAM, 0);
    if(-1==listfd)
    {
        perror("socket");
        return 1;
    }
//2设置服务器地址
    struct sockaddr_in ser,cli;
    bzero(&ser, sizeof(ser));
    bzero(&cli, sizeof(cli));
    ser.sin_family=AF_INET;
    ser.sin_port=htons(50000);
    ser.sin_addr.s_addr=INADDR_ANY;
//3绑定套接字
    int ret=bind(listfd, (SA)&ser, sizeof(ser));
    if(-1==ret)
    {
        perror("bind");
        return -1;
    }
//4开始监听
    listen(listfd, 3);//3代表同一时间可以与服务器建立连接的排队数
//5接受客户端连接
    socklen_t len=sizeof(cli);
    int conn=accept(listfd, (SA)&cli, &len);
    if(-1==conn)
    {
        perror("conn");
        return -1;
    }
//6接收初始消息建立连接
    char  buf[512];
    recv(conn, buf, strlen(buf), 0);
//7创建接收线程
    pthread_t tid;
    pthread_create(&tid, NULL, th, &conn);
//8主线程循环发送消息到客户端
    while (1)
    {
        printf("You:");
        fgets(buf, sizeof(buf), stdin);
        // buf[strlen(buf)-1]='\0';
        send(conn, buf, strlen(buf), 0);
        if(0==strcmp("#quit\n", buf))
        {
            exit(0);
        }
    }
//清理工作
    pthread_join(tid, NULL);
    close(listfd);
    close(conn);
    return 0;
}

客户端:

cpp 复制代码
#include <arpa/inet.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <strings.h>
#include<sys/socket.h>
#include<sys/types.h>
#include <thread_db.h>
#include<time.h>
#include<unistd.h>
#include<pthread.h>
typedef struct sockaddr*(SA);
//th函数是一个线程函数,负责持续接收来自服务器的消息
void *th(void *arg)
{
    int fd=*(int*)arg;
    while (1) 
    {
        char buf[128]={0};
        recv(fd, buf, sizeof(buf), 0);
        if(strcmp("#quit\n",buf)==0)
        {
            exit(0);
        }
        printf("You:%s",buf);
    }
    return NULL;
}
int main()
{
//1创建TCP套接字
    int conn=socket(AF_INET, SOCK_STREAM, 0);
    if(-1==conn)
    {
        perror("socket");
        return 1;
    }
//2设置服务器地址
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family=AF_INET;
    ser.sin_port=htons(50000);
    ser.sin_addr.s_addr=inet_addr("192.168.31.86");
//3连接服务器
    int ret=connect(conn, (SA)&ser, sizeof(ser));
    if(-1==ret)
    {
        perror("connect");
        return 1;
    }
//4发送初始消息建立连接
    char buf[512]="start";
    send(conn, buf, strlen(buf), 0);
//5创建接收线程
    pthread_t tid;
    pthread_create(&tid, NULL, th, &conn);
//6主线程循环发送消息到服务器  
    while (1)
    {
        printf("You:");
        char buf[512];
        fgets(buf, sizeof(buf), stdin);
        // buf[strlen(buf)-1]='\0';
        send(conn, buf, strlen(buf), 0);
        if(0==strcmp("#quit\n", buf))
        {
            exit(0);
        }
    }
//清理工作
    pthread_join(tid, NULL);
    close(conn);
    return 0;
}
相关推荐
sunz_dragon5 分钟前
Claude Code / Codex Git 版本管理完整使用指南
服务器·人工智能
SPC的存折28 分钟前
3、主从复制实现同步数据过滤
linux·运维·服务器
SPC的存折30 分钟前
openEuler 24.03 MariaDB Galera 集群部署指南(cz)
linux·运维·服务器·数据库·mysql
SPC的存折43 分钟前
MySQL 8.0 分库分表
linux·运维·服务器·数据库·mysql
才知道的1 小时前
stm32F407学习DAY.27 ADC
stm32·嵌入式硬件·学习
风吹迎面入袖凉1 小时前
【Redis】Redisson分布式锁原理
java·服务器·开发语言
senijusene1 小时前
i.MX6ULL 裸机 ECSPI 驱动开发详解:
arm开发·驱动开发·嵌入式硬件
day day day ...2 小时前
MyBatis条件误写引发的查询条件污染分析与防范
java·服务器·tomcat
TechMasterPlus3 小时前
Linux U-Boot 与内核启动流程深度解析:从上电到 Shell 的完整之旅
linux·运维·服务器
大白菜和MySQL3 小时前
Linux下dhcp服务搭建
linux·运维·服务器