C 实现 镜子反射 服务器,将服务器反射的信息客户端的端口号,即:服务器将客户端的端口号反弹回去。同时客户端要获取自己 的端口号,并与服务器反射回来的对比看是否一致
时间: 2024-05-08 08:15:15 浏览: 6
服务器端实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define BUF_SIZE 1024
void error_handling(char *message);
int main(int argc, char *argv[]) {
int serv_sock;
struct sockaddr_in serv_addr, clnt_addr;
socklen_t clnt_addr_size;
char message[BUF_SIZE];
int str_len;
if (argc != 2) {
printf("Usage: %s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_DGRAM, 0);
if (serv_sock == -1) {
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
error_handling("bind() error");
}
while (1) {
clnt_addr_size = sizeof(clnt_addr);
str_len = recvfrom(serv_sock, message, BUF_SIZE, 0, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (str_len < 0) {
error_handling("recvfrom() error");
}
printf("Received message: %s\n", message);
// 将客户端的端口号反弹回去
sendto(serv_sock, &clnt_addr.sin_port, sizeof(clnt_addr.sin_port), 0, (struct sockaddr*)&clnt_addr, clnt_addr_size);
}
close(serv_sock);
return 0;
}
void error_handling(char *message) {
perror(message);
exit(1);
}
```
客户端实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
void error_handling(char *message);
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in serv_addr;
socklen_t serv_addr_size;
char message[] = "Hello, server!";
int str_len;
int port;
if (argc != 3) {
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
// 发送消息到服务器
str_len = sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (str_len < 0) {
error_handling("sendto() error");
}
// 接收服务器反弹回来的消息,即客户端的端口号
serv_addr_size = sizeof(serv_addr);
str_len = recvfrom(sock, &port, sizeof(port), 0, (struct sockaddr*)&serv_addr, &serv_addr_size);
if (str_len < 0) {
error_handling("recvfrom() error");
}
printf("My port: %d. Server port: %d.\n", ntohs(serv_addr.sin_port), ntohs(port));
if (ntohs(serv_addr.sin_port) == ntohs(port)) {
printf("Port numbers match!\n");
} else {
printf("Port numbers do not match!\n");
}
close(sock);
return 0;
}
void error_handling(char *message) {
perror(message);
exit(1);
}
```