Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!
喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!数据源
存放在我的资源下载区啦!
Linux程序开发(十三):网络编程实现0521深情告白
题目:网络传情
题目描述:
小明和小红是一对异地恋的情侣,他们每天都会通过网络互相传递爱意。为了增强这种互动的乐趣,他们希望编写一个小程序来模拟发送和接收消息的过程。
要求:
请你编写一个基于 Linux 网络编程的 C 语言程序,实现以下功能:
1、小明作为服务器端,监听某个指定端口,等待小红的消息;
2、小红作为客户端,连接到小明的服务器端,并发送消息给小明;
3、小明接收到小红的消息后,打印出消息内容,并回复一个自定义的消息给小红;
4、小红接收到小明的回复后,打印出回复的消息内容。
注意事项:
程序需要处理异常情况,如网络连接失败等;
可以使用 TCP 或 UDP 协议实现。
示例:
小明的 IP 地址为 192.168.52.100,端口号为 8888;
小红的 IP 地址为 192.168.52.200,端口号为 9999。
小红发送消息:Hello, 小明!我想你了~
小明收到消息并回复:Hello, 小红!我也想你了~
小红收到回复:Hello, 小明!我也想你了~
解答:
# server.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
int main() {
int sockfd, newsockfd;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error opening socket");
exit(1);
}
// 设置服务器地址
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定套接字到指定端口
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("Error binding");
exit(1);
}
// 监听连接
listen(sockfd, 5);
printf("等待小红的消息...\n");
// 接收连接请求
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
perror("Error accepting connection");
exit(1);
}
// 接收消息
memset(buffer, 0, sizeof(buffer));
n = read(newsockfd, buffer, sizeof(buffer));
if (n < 0) {
perror("Error reading from socket");
exit(1);
}
printf("小红发送消息:%s\n", buffer);
// 回复消息
char reply[] = "Hello, 小红!我也想你了~";
n = write(newsockfd, reply, strlen(reply));
if (n < 0) {
perror("Error writing to socket");
exit(1);
}
// 关闭连接
close(newsockfd);
close(sockfd);
return 0;
}
# client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 8888
#define SERVER_IP "192.168.52.3"
int main() {
int sockfd;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256];
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error opening socket");
exit(1);}
// 获取服务器地址信息
server = gethostbyname(SERVER_IP);
if (server == NULL) {
fprintf(stderr, "Error, no such host\n");
exit(1);}
// 设置服务器地址
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
serv_addr.sin_port = htons(PORT);
// 连接服务器
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("Error connecting");
exit(1);}
// 发送消息
char message[] = "Hello, 小明!我想你了~";
if (write(sockfd, message, strlen(message)) < 0) {
perror("Error writing to socket");
exit(1);}
printf("发送消息:%s\n", message);
// 接收回复
memset(buffer, 0, sizeof(buffer));
if (read(sockfd, buffer, sizeof(buffer)) < 0) {
perror("Error reading from socket");
exit(1);}
printf("小明回复:%s\n", buffer);
// 关闭连接
close(sockfd);
return 0;}
截图:
图 4.1 服务端结果图
图 4.2 客户端结果图