⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functions.h

📁 基于C/S结构的Socket程序设计 即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行
💻 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 + -