这个程序算是这辈子写的第一个完整的程序,不是今天一天写的,之前花了四五天,不到四百行的代码对编程老鸟来说估计是分分钟的事,但我还是挺知足的,毕竟第一次。
真正自己尝试写一个程序之后才发现,之前看的所有的东西都是纸上谈兵,只有自己动手写一个程序,才会理解什么叫编程,从程序设计到程序编写到程序调试到功能优化,很多东西都是书本上学不到的。
这个程序主要实现的功能简单的说就是TCP通信,在通信之上实现双机协同工作,运行环境是windows。
贴代码:
#define _CRT_SECURE_NO_WARNINGS
#pragma comment(lib, "ws2_32.lib")
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#define PORT 8888 /*定义端口*/
#define MAXDATA 1000 /*定义最大传输数量*/
#define T 100
int exe(void)
{
long i = 100000000L;
while (i--);
printf(" This is a program that needs to be executed !\n");
return 0;
}
int main(void)
{
/*各种声明定义*/
SOCKET server;
SOCKET client;
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
WSADATA wsaData;
int len = sizeof(struct sockaddr_in);
int runTime, serverTime_i, clientTime_i, ret_1, ret_cyc, ret_time_server, ret_time_client;
int dec_1, sign_1, dec_2, sign_2;
int t = T;
int con = -1;
char port;
char receiveData[MAXDATA];
char runData[MAXDATA];
char *readyMessage_server = "I'm ready !\n";
char *readyMessage_client = "I'm ready too !\n";
char *runMessage = "Run !\n";
char serverTime_c[MAXDATA], *serverTime_c_server, clientTime_c[MAXDATA], *clientTime_c_client;
char waitTime, serverTime_d, clientTime_d;
clock_t start, end;
/*选择服务器或客户端*/
printf("Please choose server of client.\nA.Server B.Client\n");
scanf("%c", &port);
/*服务器*/
if (port == 'A' || port == 'a')
{
/*启动windows的socket服务,初始化WSA*/
WSAStartup(0x101, &wsaData);
/*创建服务端,初始化服务器地址*/
memset((void *)&serveraddr, 0, sizeof(serveraddr));
/*创建服务器套接字*/
server = socket(AF_INET, SOCK_STREAM, 0);
if (server == -1)
{
printf("Socket error !");
}
/*绑定IP和端口*/
serveraddr.sin_family = AF_INET; /*定义家族协议*/
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); /*定义主机地址*/
serveraddr.sin_port = htons(PORT); /*定义主机端口*/
if (bind(server, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == -1) /*绑定成功返回0*/
{
printf("Bind error !");
getchar();
exit(1);
}
/*开始监听*/
if (listen(server, 20) == -1)
{
printf("Listen error !");
getchar();
exit(1);
}
/*建立连接*/
printf("Waiting for connection...\n\n");
client = accept(server, (SOCKADDR *)&clientaddr, &len);
if (client == -1)
{
printf("accept error !");
getchar();
exit(1);
}
printf("Receive a connection: %s \r\n\n", inet_ntoa(clientaddr.sin_addr));
/*发送准备信息*/
if (send(client, readyMessage_server, strlen(readyMessage_server), 0) < 0)
{
printf("\n\nSend error or connection interruption !\n");
getchar();
exit(1);
}
/*接受准备信息*/
int ret_1 = recv(client, receiveData, MAXDATA, 0);
if (ret_1 > 0)
{
receiveData[ret_1] = 0x00;
printf("From client %s: %s", inet_ntoa(clientaddr.sin_addr), receiveData);
}
/*接收不到客户端数据时中断循环*/
else
{
printf("\n\nReceive error or connection interruption !\n");
getchar();
exit(1);
}
/*发出运行许可指令*/
if (strcmp(receiveData, readyMessage_client) == 0)
{
;
if (send(client, runMessage, strlen(runMessage), 0) < 0)
{
printf("\n\nSend error or connection interruption !\n");
getchar();
exit(1);
}
}
while (1)
{
/*运行时间大于周期时间,则直接运行*/
if (t >= T)
{
/*计时开始*/
start = clock();
exe();
/*计时结束*/
end = clock();
/*服务端运行用时*/
serverTime_d = (double)(end - start);
/*服务端运行用时转字符串*/
_ecvt(serverTime_d, 10, &dec_1, &sign_1);
serverTime_c_server = _ecvt(serverTime_d, dec_1, &dec_2, &sign_2);
printf("Operation time is %s\n\n", serverTime_c_server);
/*发送服务端运行用时*/
if (send(client, serverTime_c_server, strlen(serverTime_c_server), 0) < 0)
{
printf("\n\nSend error or connection interruption !\n");
getchar();
exit(1);
}
/*接收客户端运行用时*/
ret_time_client = recv(client, clientTime_c, MAXDATA, 0);
if (ret_time_client > 0)
{
clientTime_c[ret_time_client] = 0x00;
}
else
{
printf("\n\nReceive error or connection interruption !\n");
getchar();
exit(1);
}
/*字符串转整形*/
serverTime_i = atoi(serverTime_c_server);
printf("Server's operation time is %d\n", serverTime_i);
clientTime_i = atoi(clientTime_c);
printf("Client's operation time is %d\n", clientTime_i);
/*比较服务端、客户端用时长短*/
if (serverTime_i >= clientTime_i)
{
runTime = serverTime_i;
}
else
{
runTime = clientTime_i;
}
t = runTime;
printf("The whole system's opration time is %d\n\n", t);
/*运行总时长小于周期时间,挂起*/
if (t <= T)
{
waitTime = T - t;
Sleep(waitTime);
t = T;
}
}
}
/*客户端关闭,提示连接中断*/
printf("Connection interruption !\n");
getchar();
exit(1);
}
/*客户端*/
else
{
/*启动windows的socket服务,初始化WSA*/
WSAStartup(0x101, &wsaData);
/*创建服务端,初始化服务器地址*/
memset((void *)&clientaddr, 0, sizeof(clientaddr));
/*创建服务器套接字*/
client = socket(AF_INET, SOCK_STREAM, 0);
if (client == -1)
{
printf("Socket error !");
getchar();
exit(1);
}
/*绑定IP和端口*/
clientaddr.sin_family = AF_INET; /*定义家族协议*/
clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); /*定义主机地址*/
clientaddr.sin_port = htons(PORT); /*定义主机端口*/
while (1)
{
/*连接中断,跳出循环,提示连接中断*/
if (con == 1)
{
break;
}
/*启动程序时循环连接服务端*/
while (con == -1)
{
con = connect(client, (struct sockaddr *)&clientaddr, sizeof(clientaddr));
if (con == -1)
{
printf("Connection error !\n");
}
}
/*接收准备信息*/
ret_1 = recv(client, receiveData, MAXDATA, 0);
if (ret_1 > 0)
{
receiveData[ret_1] = 0x00;
printf("From server: %s", receiveData);
}
/*接受不到客户端数据时中断循环*/
else
{
printf("\n\nReceive error or connection interruption !\n");
getchar();
exit(1);
}
/*发送准备信息*/
if (send(client, readyMessage_client, strlen(readyMessage_client), 0) < 0)
{
printf("\n\nSend error or connection interruption !\n");
getchar();
exit(1);
}
/*接收运行许可指令*/
ret_cyc = recv(client, runData, MAXDATA, 0);
if (ret_cyc > 0)
{
runData[ret_cyc] = 0x00;
printf(runData);
}
/*接收不到服务端数据时中断循环*/
else
{
printf("\n\nReceive error or connection interruption !\n");
getchar();
exit(1);
}
/*检验运行许可指令并开始执行*/
if (strcmp(runData, runMessage) == 0)
{
while (con == 0)
{
if (t >= T)
{
/*计时开始*/
start = clock();
exe();
/*计时结束*/
end = clock();
/*客户端运行用时*/
clientTime_d = (double)(end - start);
/*服务端运行用时转字符串*/
_ecvt(clientTime_d, 10, &dec_1, &sign_1);
clientTime_c_client = _ecvt(clientTime_d, dec_1, &dec_2, &sign_2);
printf("Operation time is %s\n\n", clientTime_c_client);
/*发送服务端运行用时*/
if (send(client, clientTime_c_client, strlen(clientTime_c_client), 0) < 0)
{
printf("\n\nSend error or connection interruption !\n");
getchar();
exit(1);
}
/*接收客户端运行用时*/
ret_time_server = recv(client, serverTime_c, MAXDATA, 0);
if (ret_time_server > 0)
{
serverTime_c[ret_time_server] = 0x00;
}
else
{
printf("\n\nReceive error or connection interruption !\n");
getchar();
exit(1);
}
/*字符串转整形*/
serverTime_i = atoi(serverTime_c);
printf("Server's operation time is %d\n", serverTime_i);
clientTime_i = atoi(clientTime_c_client);
printf("Client's operation time is %d\n", clientTime_i);
/*比较服务端、客户端用时长短*/
if (serverTime_i >= clientTime_i)
{
runTime = serverTime_i;
}
else
{
runTime = clientTime_i;
}
t = runTime;
printf("The whole system's opration time is %d\n\n", t);
/*运行总时长小于周期时间,挂起*/
if (t <= T)
{
waitTime = T - t;
Sleep(waitTime);
t = T;
}
}
}
}
}
/*客户端关闭,提示连接中断*/
printf("Connection interruption !\n");
getchar();
exit(1);
}
return 0;
}
因为是写了很多天的一个程序了,功能基本能想到的都优化过了,学到的东西真的很多,大概列一列吧:
- Socket编程的思路,其中各个函数的含义
- 数据传输的阻塞和非阻塞
- 数据存储的大小端(字节序)
- char *a和char a[]的区别
- VS到底该怎么用
- 其实还有很多,这些只是我暂时能想到的
其实今天是偷懒了,本来想把昨天的计算器程序完善一下的,但因为工作需要,就先这个程序收了个尾,不过加的代码应该超过百行了,明天继续,希望自己可以坚持。