📄 functions.h
字号:
//**********系统头文件*******************************************
#include "WinSock2.h"
#include "ws2tcpip.h"
#include <stdio.H>
#include <time.h>
#include <conio.h>
//**********系统Lib***********************************************
#pragma comment(lib,"ws2_32")
//**********宏定义************************************************
#define UDP_PORT 52103
#define MAX_MSG_SIZE 1024
//**********自定义结构********************************************
struct THREAD_PARAMETER
{
SOCKET sock_accept; //服务器套接字
char* ip; //服务器IP地址
};
//**********函数**************************************************
//****************************************************************
//***函数声明: void PrintTime()
//***函数说明: 显示系统当前时间
//****************************************************************
void PrintTime()
{
char t_str[9];
_strtime(t_str);
printf("at %s\t",t_str);
}
//****************************************************************
//***函数声明: char* GetHostIP()
//***函数说明: 获得主机IP地址
//***返回值: IP地址的字符串
//****************************************************************
char* GetHostIP()
{
char FAR host[128];
if(gethostname(host, sizeof(host))==SOCKET_ERROR)
{
PrintTime();printf("gethostname Failed!\n");
return NULL;
}
hostent FAR * pHost;
if((pHost=gethostbyname(host))==NULL)
{
PrintTime();printf("gethostbyname\n");
return NULL;
}
in_addr ia=*(in_addr*)pHost->h_addr_list[0];
char* IP=inet_ntoa(ia);
return IP;
}
//****************************************************************
//***函数声明: int InitSocket(SOCKET& sock,char* hostip,
//*** u_short u_port,int type)
//***函数说明: 初始化套接字
//***参数说明: SOCKET& sock,套接字引用
//*** char* hostip,主机IP地址
//*** u_short u_port,端口号
//*** int type,套接字类型(SOCK_STREAM or SOCK_DGRAM)
//***返回值: 成功返回1,失败返回-1
//****************************************************************
int InitSocket(SOCKET& sock,char* hostip,u_short u_port,int type)
{
sock = socket(AF_INET, type, 0);
if (sock == INVALID_SOCKET)
{
PrintTime();printf("Create Socket error!\n");
return -1;
}
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(u_port);
sa.sin_addr.s_addr=inet_addr(hostip);
if(bind(sock,(LPSOCKADDR)&sa,sizeof(sa))==SOCKET_ERROR)
{
PrintTime();printf("bind failed!\n");
return -1;
}
return 1;
}
//****************************************************************
//***函数声明: void GetServerTime(SOCKET sock,char* ip,
//*** unsigned short port)
//***函数说明: 客户端请求服务器时间,收到后显示
//***参数说明: SOCKET sock,套接字
//*** char* ip,服务器IP地址
//*** unsigned short port,服务器端口号
//****************************************************************
void GetServerTime(SOCKET sock,char* ip,unsigned short port)
{
char* msg="GET CUR TIME";
int len=strlen(msg)+1;
if(send(sock,msg,len,0)==SOCKET_ERROR ) printf("Send failed!");
PrintTime();printf("Send \"GET CUR TIME\" to the server %s:%d by TCP\n",ip,port);
char str_time[9];
if(recv(sock,str_time, 9,0)==SOCKET_ERROR) printf("recv failed");
PrintTime();printf("Recieve time %s from the server %s:%d by TCP\n",str_time,ip,port);
}
//****************************************************************
//***函数声明: void UDPEcho(SOCKET sock,char* srv_ip,
//*** unsigned short udp_port)
//***函数说明: 使用UDP实现回显字符串
//***参数说明: SOCKET sock,套接字
//*** char* ip,服务器IP地址
//*** unsigned short port,服务器端口号
//****************************************************************
void UDPEcho(SOCKET sock,char* srv_ip,unsigned short udp_port)
{
sockaddr_in addr_srv_udp;
addr_srv_udp.sin_family = AF_INET;
addr_srv_udp.sin_port = htons(udp_port);
addr_srv_udp.sin_addr.s_addr=inet_addr(srv_ip);
char buffer[MAX_MSG_SIZE];
memset(buffer, 0, MAX_MSG_SIZE);
printf("Input a string: ");
scanf("%s",buffer);
int len=sizeof(addr_srv_udp);
if(sendto(sock,buffer,strlen(buffer)+1,0,(struct sockaddr *)&addr_srv_udp,len)==SOCKET_ERROR ){
printf("Sendto() error code: %d\n",WSAGetLastError());closesocket(sock);return;}
printf("\n");
PrintTime();printf("Send user input \"%s\" to the server %s:%d by UDP\n",buffer,srv_ip,udp_port);
char str[MAX_MSG_SIZE];
memset(str, 0, MAX_MSG_SIZE);
while (true)
{
sockaddr_in addr_srv;
int l=recvfrom(sock,str,MAX_MSG_SIZE,0,(struct sockaddr *)&addr_srv,&len);
if (l!=-1)
{
char* ip=inet_ntoa(addr_srv.sin_addr);
unsigned short port =ntohs(addr_srv.sin_port);
if (!strcmp(srv_ip,ip)&&port==udp_port)
{
if (!strcmp(str,buffer))
{
PrintTime();printf("Recieve \"%s\" from the server %s:%d by UDP\n",buffer,srv_ip,udp_port);
break;
}
else
{
PrintTime();printf("Recieve wrong message from the server %s:%d by UDP\n",srv_ip,udp_port);
}
}
}
}
closesocket(sock);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -