TCP通信聊天服务端和客户端(C/C++语言开发)附完整源码
2023-04-18 15:26:36 时间
距离上次学Python写的Python实现简单聊天室已经过去好久了,现在学c++又写了一遍,其实过程差不多,无非是语法的变化,目前仅实现最简单的一对一的通信,然后改就是了,接下来应该是多线程了,话不多说直接贴上源码;
一、服务端源码
#include <stdio.h>
#include <arpa/inet.h>
// #include <sys/types.h>
// #include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(){
//1、socket
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd == -1){
perror("socket");
exit(-1);
}
// 2、bind ip and port
struct sockaddr_in saddr; //专用socket地址
saddr.sin_family = PF_INET;//协议族,ipv4的AF_INET也可以
// inet_pton(AF_INET, "192.168.193.128", saddr.sin_addr.s_addr);
saddr.sin_addr.s_addr = INADDR_ANY; // 监听所有外网接口, INADDR_ANY = 0
saddr.sin_port = htons(9999);//绑定的服务端口9999
int ret = bind(sfd, (struct sockaddr *)&saddr, sizeof(saddr));
if (ret == -1){
perror("bind");
exit(-1);
}
// 3、listen
ret = listen(sfd, 128);
if (ret == -1){
perror("listen");
exit(-1);
}
// 4、accept
struct sockaddr_in client_addr;
socklen_t addrlen = sizeof(client_addr);//客户端socket地址的大小
int newfd = accept(sfd, (struct sockaddr *)&client_addr, &addrlen);
if (newfd == -1){
perror("accept");
exit(-1);
}
// output connect message
char clientIP[16];
inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, clientIP, sizeof(clientIP));
unsigned short clientPort = ntohs(client_addr.sin_port);
printf("client %s:%d is connect.
", clientIP, clientPort);
// 5、recv and send
char recvBuf[1024] = {0};
while(1){
memset(recvBuf, 0, sizeof(recvBuf)); //clear buffer
int num = read(newfd, recvBuf, sizeof(recvBuf));//read datas
if (num == -1){
perror("read");
exit(-1);
} else if (num > 0){
printf("client message : %s
", recvBuf);
} else if (num == 0){
printf("server close.");
break;
}
char respondData[] = "Your message is receive,thanks!";
write(newfd, respondData, sizeof(respondData));
}
// 6、close
close(sfd);
close(newfd);
return 0;
}
二、客户端源码
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
// 1.创建套接字
int fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1) {
perror("socket");
exit(-1);
}
// 2.连接服务器端
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
inet_pton(AF_INET, "192.168.223.128", &serveraddr.sin_addr.s_addr);
serveraddr.sin_port = htons(9999);
int ret = connect(fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if(ret == -1) {
perror("connect");
exit(-1);
}
// 3. 通信
char recvBuf[1024] = {0};
char client_data[1024];// 从键盘输入,给客户端发送数据
while(1) {
memset(client_data, 0, sizeof(client_data));
printf("请输入发送数据:");
scanf("%s", client_data);
write(fd, client_data, strlen(client_data));
sleep(1);
int ret = read(fd, recvBuf, sizeof(recvBuf));
if(ret == -1) {
perror("read");
exit(-1);
} else if(ret > 0) {
printf("server message : %s
", recvBuf);
} else if(ret == 0) {
printf("server closed...
");
break;
}
}
// 关闭连接
close(fd);
return 0;
}
三、效果
服务端:
客户端:
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击