此文章将展示两个C++应用程序,这个应用中都分别定义了作为Serve和Client的部分,便于相互发送和接收测试。
测试分为两部分,第一部分测试是字符串的发送和接收,第二部分测试是结构体的发送和接收(其实也是先转化为字符串发送,接收后再转化为结构体的方式)
使用者可对相应部分进行注释和取消注释,以分别测试这两个功能。
源文件: 
~代码
Code1:这段代码用作发送(实际稍作修改后发送和接收都可)
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <cstring>
#include <vector>
#include <unistd.h>
#include <typeinfo>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
struct TEST
{
int test;
};
struct INFO
{
int year;
int month;
int day;
TEST test_struct;
double temperature;
};
int main(int argc, char* argv[])
{
struct sockaddr_in Server;
int serverSocket = socket(PF_INET, SOCK_DGRAM, 0);
Server.sin_family = AF_INET;
Server.sin_addr.s_addr = inet_addr("127.0.0.1");
Server.sin_port = htons(8001);
bind(serverSocket, (sockaddr *)&Server, sizeof(sockaddr));
struct sockaddr_in Client;
int clientSocket = socket(PF_INET, SOCK_DGRAM, 0);
Client.sin_family = AF_INET;
Client.sin_addr.s_addr = inet_addr("127.0.0.3");
Client.sin_port = htons(8001);
INFO sendinfo,recvinfo;
char send_info_buf[100], recv_info_buf[100];
char sendbuf[100]= "How are you?", recvbuf[100];
sendinfo.year = 2021;
sendinfo.month = 7;
sendinfo.day = 27;
sendinfo.test_struct.test = 10;
sendinfo.temperature = 23.50;
memcpy(send_info_buf, &sendinfo, sizeof(sendinfo));
while (1)
{
usleep(2000000);
int t = sendto(clientSocket, send_info_buf, sizeof(send_info_buf)+1 , 0, (sockaddr*)&Client, sizeof(Client));
cout << "sendto_len: "<<t << endl<< endl;
}
close(serverSocket);
return 0;
}
Code2:这段代码用作接收(实际稍作修改后发送和接收都可)
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <cstring>
#include <vector>
#include <unistd.h>
#include <typeinfo>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
struct TEST
{
int test;
};
struct INFO
{
int year;
int month;
int day;
TEST test_struct;
double temperature;
};
int main(int argc, char* argv[])
{
struct sockaddr_in Server;
int serverSocket = socket(PF_INET, SOCK_DGRAM, 0);
Server.sin_family = AF_INET;
Server.sin_addr.s_addr = inet_addr("127.0.0.3");
Server.sin_port = htons(8001);
bind(serverSocket, (sockaddr *)&Server, sizeof(sockaddr));
struct sockaddr_in Client;
int clientSocket = socket(PF_INET, SOCK_DGRAM, 0);
Client.sin_family = AF_INET;
Client.sin_addr.s_addr = inet_addr("127.0.0.1");
Client.sin_port = htons(8001);
INFO sendinfo,recvinfo;
char send_info_buf[100], recv_info_buf[100];
char sendbuf[100]= "Hello!", recvbuf[100];
sendinfo.year = 1999;
sendinfo.month = 11;
sendinfo.day = 20;
sendinfo.test_struct.test = 10;
sendinfo.temperature = 18.30;
memcpy(send_info_buf, &sendinfo, sizeof(sendinfo));
while (1)
{
socklen_t len = sizeof(sockaddr);
recvfrom(serverSocket, recv_info_buf, sizeof(recv_info_buf), 0, (sockaddr *)&Server, &len);
memcpy(&recvinfo, recv_info_buf, sizeof(recv_info_buf));
cout << "Today is " << recvinfo.year << "." << recvinfo.month<<"." << recvinfo.day << endl;
cout << "The template is " << recvinfo.temperature << endl;
cout << "The struct-test number is " << recvinfo.test_struct.test << endl<<endl;
}
close(clientSocket);
return 0;
}
~编译
可用以下命令编译对应源代码:
g++ Code1.cpp -o Code1
g++ Code2.cpp -o Code2
生成可执行文件: 若未安装g++,可用以下命令安装
sudo apt-get install g++
输入密码后按步骤提示即可安装
~执行
可用以下命令执行对应可执行文件:
./Code1
./Code2
~效果
 反向的发送和接收可尝试后自行测试
|