🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
利用C/C++语言,使用TCP/IP协议,编一个简易聊天程序
简易聊天程序要求:
1.使用c/c++语言;
2.利用TCP/IP协议,实现局域网内的聊天通信,可互发消息及图片,并实现通信记录保存;
3.ui风格自拟。
4.编程环境:VS、QT,或其他自选,VS或QT环境下选择窗口项目。
5.教一下我如何运行你写的程序(用什么软件、程序放到哪里)
如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。
解决方案
如下是上述问题的解决方案,仅供参考:
创建一个完整的简易聊天程序,我可以提供一个基础的框架和指导,帮助你开始构建这个程序。下面是一个使用C语言和TCP/IP协议的简易聊天程序的基本框架,以及如何运行它的说明。
服务端代码示例(server.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 8080
#define MAXBUF 2048
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[MAXBUF] = {0};
char *hello = "Hello from server";
server_fd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, (char *)&opt, sizeof(opt));
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
listen(server_fd, 5);
printf("Server is listening on port %d\n", PORT);
while (1) {
new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
if (new_socket < 0) {
perror("Accept failed");
exit(1);
}
printf("Server accepted new connection\n");
send(new_socket, hello, strlen(hello), 0);
read(new_socket, buffer, MAXBUF);
printf("Client said : %s\n", buffer);
// 保存通信记录到文件
FILE *file = fopen("server_log.txt", "a");
if (file) {
fputs(buffer, file);
fclose(file);
}
close(new_socket);
}
return 0;
}
客户端代码示例(client.c):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#define PORT 8080
#define MAXBUF 2048
void error(const char *msg) {
perror(msg);
exit(1);
}
int main(int argc, char *argv[]) {
int sockfd, connfd;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[MAXBUF];
if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
// 建立socket连接
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(PORT);
// 连接到服务器
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
error("ERROR connecting");
printf("Please enter message : ");
while(fgets(buffer, MAXBUF, stdin) != NULL) {
write(sockfd, buffer, strlen(buffer));
read(sockfd, buffer, MAXBUF);
printf("From server : %s",buffer);
}
close(sockfd);
return 0;
}
编译和运行程序:
编译程序:使用GCC编译器编译服务端和客户端程序。打开终端或命令提示符,然后运行以下命令:
gcc server.c -o server gcc client.c -o client
运行服务端:在终端运行编译好的服务端程序:
./server
运行客户端:在另一个终端窗口运行客户端程序,并提供服务器的主机名或IP地址作为参数:
./client hostname_or_IP_address
聊天:在客户端程序中输入消息,然后按回车发送。服务端将接收消息并将其保存到
server_log.txt
文件中,然后返回一条消息给客户端。
注意事项:
- 这个示例程序是非常基础的,没有错误处理和多客户端支持。
- 实际的聊天程序可能需要更多的特性,比如多线程或非阻塞I/O来同时处理多个客户端。
- UI风格可以通过图形界面库如Qt来实现,但这需要更深入的学习和代码编写。
如果你只学过基础的C语言,我建议你从基础的TCP/IP socket编程开始学习,逐步增加功能和复杂性。同时,Qt等图形界面库的学习曲线可能比较陡峭,需要一定的时间来掌握。
希望如上措施及解决方案能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。