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

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

1、UDP实现

服务器端:

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

客户端:

#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实现

服务器端:

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

客户端:

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

http://www.dtcms.com/a/295797.html

相关文章:

  • FreeSWITCH 简单图形化界面45 - 收集打包的一些TTS
  • 复矩阵与共轭转置矩阵乘积及其平方根矩阵
  • 【建模与仿真】融合共现网络特征与知识增强语义梯度提升电子邮件分类
  • HttpServletRequest深度解析:Java Web开发的核心组件
  • LLM中的位置嵌入矩阵(Position Embedding Matrix)是什么
  • [语言模型训练]基于 PyTorch 的双向 LSTM 文本分类器实现:基于旅店的评论分类语言模型
  • LeetCode 2563.统计公平数对的数目
  • Edwards爱德华泵软件 支持nEXT85和nXDS系列泵,包括nXRi, nRVi和nXLi增强型 nEXT nXDS nXLi
  • 【自动化测试】JMeter+Jenkins自动化接口与性能测试环境部署指南
  • Java学习第七十部分——微服务架构
  • JavaWeb_原始项目初识(一)
  • ubuntu25.04+4070+cuda+docker安装
  • 进程通信————命名管道
  • Python-初学openCV——图像预处理(二)
  • 怎么样知道服务端是否支持sse服务?
  • 在 Ubuntu 20.04 上轻松安装和使用中文输入法
  • ZooKeeper 是什么?
  • day20 双向链表
  • 基于CloudBase+React+CodeBudddy的云上智能睡眠应用开发实践
  • 网易大模型算法面经总结第一篇
  • uni-app小程序云效持续集成
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(三)
  • MYSQL中NOT IN和NOT EXISTS
  • vscode 的 settings.json
  • Go语言管道Channel通信教程
  • Lua(table)
  • 数据库集群环境漏洞修复
  • Vue-23-通过flask接口提供的数据使用plotly.js绘图(二)
  • Python爬虫实战:与dominoup.com平台结合的域名数据分析系统
  • 【数据可视化-72】苏超第七轮战罢:黑金大屏下的足球数据洞察(含完整代码、数据和大屏)