SOCKET实现服务端与客户端之间的相关简单联系(文件的收发,网页的下载,登录界面的编写)

首先是客户端代码


图实现的是网页资源的下载


#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include <Ws2tcpip.h>
#include<windows.h>
#include<string.h>
#define PORT 5000//定义默认接口
#define max 1048576//定义一兆的字节
#define IP "127.0.0.1"//定义默认ip地址
#pragma comment(lib,"ws2_32.lib")
WSADATA date;
SOCKET client;
struct sockaddr_in hzy;
WORD sockVersion = MAKEWORD(2, 2);
int start()//初始化socket
{
	printf("客户端创建中请稍后......\n");
	if (WSAStartup(sockVersion, &date) != 0)
	{
		printf("初始化失败%d", WSAGetLastError());
		//system("pause");
		return 0;
	}
	Sleep(20);
	printf("loading......\n");
	client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (client == INVALID_SOCKET)
	{
		printf("客户端创建失败请重试,错误代码%d", WSAGetLastError());
		//system("pause");
		return 0;
	}
	printf("【创建成功】\n");
	return 1;
}
void gotoxy(int x, int y)//清理屏幕
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}
int bijiao(char *p)//比较字符串
{
	const char *q[10] = {"help","txt","jpg","mp4"};
	int xc = 0;
	for(int i=0;i<4;i++)
	{ 
	while (!(xc = *p - *q[i]) && *q[i])
	{
		*p++;
		*q[i]++;

	}
	if (!xc)return i;
	}
	return 00;

}
int wenjian()//实现下载文本,图片,和视频,但是没有完善指定地址的功能
{
	
	FILE *write;
	char *movie;
	movie = (char *)malloc(sizeof(char)*max);
	char str[20];
	printf("请继续你要进行的操作!(获取帮助请输入help)\n");
nm:scanf("%s", str);
	if (str[0] == 'g')return 0;
	switch (bijiao(str))
	{
	case 0: {
		printf("获取txt文件,请输入txt\n");
		printf("获取jpg文件,请输入jpg\n");
		printf("获取mp4文件,请输入mp4\n");
		printf("若要返回主菜单,请输入g\n");
		goto nm;
	}break;
	case 1://下载文本
	{  
		send(client, str, strlen(str), 0);
		char *txt;
		txt = (char *)malloc(sizeof(char)*max);
	if ((write = fopen("G:\\yk\\Desktop\\txt.txt", "wb")) == NULL)
	{
		printf("cannot open!\n");
	}
	int i = 0;
	recv(client, txt, 1048576, 0);
	printf("downing......\n");
	while (txt[i] != EOF)
	{
		fputc(txt[i], write);
		i++;
	}
	free(txt);
	fclose(write);
	printf("[txt文件下载完毕]\n");

	}break;
	case 2://下载图片
	{
		send(client, str, strlen(str), 0);
		char *picture;
		picture = (char *)malloc(sizeof(char)*max);
		if ((write = fopen("G:\\yk\\Desktop\\picture.jpg", "wb")) == NULL)
		{
			printf("cannot open!\n");
		}
		int d = 0;
		int i = 0;
		char ch;
		printf("downing......\n");

		while ((d = recv(client, picture, 1048576, 0)) > 0)
		{

			for (i = 0; i <= d; i++)
			{
				ch = picture[i];
				fputc(ch, write);
			}
			i = 0;
		}
		fclose(write);
		free(picture);
		printf("[jpg文件下载完毕]\n");
	}break;
	case 3://下载视频
	{
		send(client, str, strlen(str), 0);
		if ((write = fopen("G:\\yk\\Desktop\\124.mp4", "wb")) == NULL)
		{
			printf("cannot open!\n");
		}
		char ch;
		int d = 0;
		int i = 0;
		printf("downing......\n");
		while ((d = recv(client, movie, 1048576, 0)) > 0)
		{
			for (i = 0; i <= d; i++)
			{
				ch = movie[i];
				fputc(ch, write);
			}
			if (i < max)break;
			i = 0;
		}
		if (d = recv(client, movie, 1048576, 0) != SOCKET_ERROR)
		{
			char *bn;
			bn = (char *)malloc(sizeof(char)*max);
			for (i = 0; i <= d; i++)
			{
				ch = bn[i];
				fputc(ch, write);
			}
		}
		fclose(write);
		free(movie);
		printf("[MP4文件下载完毕]\n");
	}break;
	}
	//
	return 1;
}	
int webinformation()//获取网站的相关信息,和下载网页源代码
{
	 char url[20];
	 printf("请输入你要进行操作的网址\n");
   scanf("%s", url);
	struct hostent *website_host = NULL;
	char **ptr;
	char str[100];
	website_host = gethostbyname(url);
	if (website_host == NULL)
	{
		perror("gethostbyname error");
		return 0;
	}

	printf("主机名%s\n", website_host->h_name);
	for (ptr = website_host->h_aliases; *ptr != NULL; ptr++)
		printf("别名:%s\n", *ptr);
	switch (website_host->h_addrtype) {
	case AF_INET:
	case AF_INET6:
		for (ptr = website_host->h_addr_list; *ptr != NULL; ptr++) {
			printf("ip地址: %s\n",
				inet_ntop(website_host->h_addrtype, website_host->h_addr_list, str, strlen(str)));
		}
		break;
	default:
		printf("unknown address type\n");
		break;
	}
	printf("%d\n", website_host->h_length);
	struct in_addr ina;
	//解析IP  
	memmove(&ina, website_host->h_addr, 4);
	LPSTR ipstr = inet_ntoa(ina);
	
	printf("concenting......\n");
	hzy.sin_family = AF_INET;
	hzy.sin_port = htons(80);
	hzy.sin_addr.S_un.S_addr = inet_addr(ipstr);
	if (connect(client, (sockaddr *)&hzy, sizeof(hzy)) == SOCKET_ERROR)
	{
		printf("连接错误%d\n", WSAGetLastError());
		closesocket(client);
		return 0;
	}
	printf("【连接成功】\n");
	char request[1024] = "GET /?st=1 HTTP/1.1\r\nHost:";
	strcat(request, url);
	strcat(request, "\r\nConnection:Close\r\n\r\n");
	int ret = send(client, request, strlen(request), 0);
	//获取网页内容  
	printf("[正在获取网页信息]\n");
	FILE *f = fopen("G:\\yk\\Desktop\\web.html","w");
	int isstart = 0;
	while (ret > 0)
	{
		const int bufsize = 1024;
		char* buf = (char*)calloc(bufsize, 1);
		ret = recv(client, buf, bufsize - 1, 0);
		fprintf(f, "%s", buf);
		free(buf);
	}
	fclose(f);
	printf("读取网页内容成功,已保存在%s.html中\n", url);
	return 1;

}
int lianjie()//连接默认服务器
{
	
	printf("concenting......\n");
	hzy.sin_family = AF_INET;
	hzy.sin_port = htons(PORT);
	hzy.sin_addr.S_un.S_addr = inet_addr(IP);
	if (connect(client, (sockaddr *)&hzy, sizeof(hzy)) == SOCKET_ERROR)
	{
		printf("连接错误,请重试,错误代码%d", WSAGetLastError());
		closesocket(client);
		return 0;
	}
	printf("【连接成功】\n");
	char dff[] = "A";
	send(client, dff, strlen(dff), 0);
	return 1;
}
int linjie()//连接服务器
{
	
	char ip[20];
	int port;
	printf("[请输入所要访问的服务器的IP地址以及端口号用空格隔开]\n");
	scanf("%s%d", ip, &port);
	printf("concenting......\n");
	hzy.sin_family = AF_INET;
	hzy.sin_port = htons(port);
	hzy.sin_addr.S_un.S_addr = inet_addr(ip);
	if (connect(client, (sockaddr *)&hzy, sizeof(hzy)) == SOCKET_ERROR)
	{
		printf("连接错误,请重试,错误代码%d\n", WSAGetLastError());
		closesocket(client);
		return 0;
	}
	printf("【连接成功】\n");
	char df[] = "B";
	send(client, df, strlen(df), 0);
	return 1;
}
int denlu()//登录服务器
{
	char  recever[1],id[20],mima[20];
	printf("请登录。。。。。\n");
x1:	printf("请输入账号:");
scanf("%s", id);
	if (id[0] == 'g')return 0;
	send(client, id, strlen(id), 0);
	recv(client, recever, 1, 0);
	if (recever[0] =='A')
	{
		printf("没有该用户请重新输入\n");
		printf("若要返回主菜单,请输入g\n");
		goto x1;

	}
	else if (recever[0]=='a')
	{
		x2:printf("请输入密码:");
		scanf("%s", mima);
		if (mima[0] == 'g')return 0;
	}
	
	send(client, mima, strlen(mima), 0);
	recv(client, recever, 1, 0);
	if (recever[0]=='B')
	{
		printf("若要返回主菜单,请输入g\n");
		printf("密码错误,请重新输入:");
		
		goto x2;
	}
	else if (recever[0] == 'b')
	{
		printf("登录成功!!!\n");
		printf("Now you can download text files, image files and video files on the server\n");
		return 1;
	}



}
void jiemian()//界面
{
	int jiemian[10][120];
	for (int i = 0; i < 120; i++) 
	{
		jiemian[0][i] = 1;
		jiemian[9][i] = 1;
		if (i < 10)
		{
			jiemian[i][0] = 1;
			jiemian[i][119] = 1;
		}
		for (int j = 0; j < 10; j++)
		{
			if (i == j)
			{
				jiemian[j][i] = 1;
				jiemian[j][i+1] = 1;
				jiemian[j][i+2] = 1;
				jiemian[j][i+3] = 1;
				jiemian[j][i + 4] = 1;
			}
			if (j == i - 17)
			{
				jiemian[j][i] = 1;
				jiemian[j][i + 1] = 1;
				jiemian[j][i + 2] = 1;
				jiemian[j][i + 3] = 1;
				jiemian[j][i + 4] = 1;
			}
			if (i == 13)
			{
				jiemian[j][i] = 1;
				jiemian[j][i + 1] = 1;
				jiemian[j][i + 2] = 1;
				jiemian[j][i + 3] = 1;
				jiemian[j][i + 4] = 1;
			}
		}
	}

g2:for (int j = 0; j < 10; j++)
	{
	for (int i = 0; i < 120; i++)
	{
		
			if (jiemian[j][i] == 1)printf("*");
			else printf(".");
		}
		printf("\n");
	}
	printf("[WELCOME USE MY SOCKET!]\n");
	printf("“请选择你将要进行的操作!”\n");
	printf("[1.Default server connection!]\n");
	printf("[2.Any resource that can properly connect to the website!]\n");
	printf("[3.Any server connection]\n");
}
int send()//发送信息
{
	
	char message[200], recever[20000];
	printf("请输入发送的信息:\n");
	scanf("%s", message);
	if (send(client, message, strlen(message), 0) < 0)
	{
		printf("发送失败%d", WSAGetLastError());
		return 0;
	}
	int c = recv(client, recever, 20000, 0);
	if (c>0)
	{
		printf("[");
		recever[c] = 0x00;
		printf("返回的信息:\n");
		printf(recever);
		printf("]\n");
	}
	return 1;
}
int main()
{
	int a;
	 g2:jiemian();
	 while (scanf("%d", &a) == 1)
	 {
		 switch (a)
		 {
		 case 1:
		 {
		 g1:if (!start())
		 {
			 goto g1;
		 }
			if (!lianjie())
			{
				goto g1;
			}
			if (!denlu())
			{
				goto g2;
			}
			if (!wenjian())
			{
				goto g2;
			}
			closesocket(client);
			WSACleanup();
			printf("The relevant operation is now over. After 5 seconds, it will return to the main menu and clear the screen\n");
			printf("[y]\n");
			if (_getch() == 'y')
			{
				gotoxy(0, 0);
				system("cls");
				goto g2;
			}
		 }break;
		 case 2:
		 {
		 h1:if (!start())
		 {
			 goto h1;
		 }
			if (!webinformation())
			{
				goto h1;
			}

			closesocket(client);
			WSACleanup();
			printf("The relevant operation is now over. After 5 seconds, it will return to the main menu and clear the screen\n");
			printf("[y]\n");
			if (_getch() == 'y')
			{
				gotoxy(0, 0);
				system("cls");
				goto g2;
			}

		 }break;
		 case 3:
		 {
		 j1:if (!start())
		 {
			 goto j1;
		 }
			if (!linjie())
			{
				goto g2;
			}
			if (!send())
			{
				goto g2;
			}
			closesocket(client);
			WSACleanup();
			printf("The relevant operation is now over. After 5 seconds, it will return to the main menu and clear the screen\n");
			printf("[y]\n");
			if (_getch() == 'y')
			{
				gotoxy(0, 0);
				system("cls");
				goto g2;
			}
		 }
		 }
	 }
	system("pause");
}

相关socket函数的介绍

请看https://blog.csdn.net/qingkongyeyue/article/details/52921559(这位大佬写的很详细)

接下来是服务端(比较粗糙,没有实现太多的功能,就只是一个简单的文件传输)


#include<winsock2.h>
#include<stdio.h>
#define PORT 5000
#pragma comment(lib,"ws2_32.lib")
#define H 1048576
WSADATA date;
WORD funsh = MAKEWORD(2, 2);
SOCKET seversock;//服务端进程
SOCKET clientsock;//客户端进程
SOCKADDR_IN severaddr;
SOCKADDR_IN clientaddr;
int port = PORT;
int clientaccept;
const char s[] = "a";
const char s1[] = "A";
const char x[] = "b";
const char x1[] = "B";
struct date
{

	char id[11];
	char power[10];
	
}a[] = {
	{"2017211146","yk49952"} };
FILE *open, *write;
int bijao(char *p, char *q)//比较字符串
{
	int xc = 0;
	while (!(xc = *q - *p)&&*q)
	{
		*q++;
		*p++;
		if (*q == '\0')
			break;
		
	}
	if (!xc)
	{
		return 1;
	}
	return 0;
}
int bijiao(char *p)
{
	const char *q[10];
	q[0] = "txt";
	q[1] = "jpg";
	q[2] = "mp4";
	q[3] = "A";
	q[4] = "B";
	int xc = 0;
	for(int i=0;i<5;i++)
	{ 
		while (!(xc = *q[i] - *p) && *q[i])
		{
			*q[i]++;
			*p++;
			if (*q[i] == '\0')
				break;
		}
		if (!xc)return i+1;
	}
	return 0;
}

void wenjian()//发送文件
{
	char wenjianname[10];
	recv(clientsock, wenjianname, strlen(wenjianname), 0);
	switch (bijiao(wenjianname))
	{
	case 1: 
	{
		char *hc;
		hc = (char *)malloc(sizeof(char)*H);
			if ((open = fopen("G:\\yk\\Desktop\\新建文件夹\\学生信息管理系统.txt", "rb")) == NULL)
			{
				printf("cannot open!\n");
			}
			
			int i = 0;
			while (!feof(open))
			{
				hc[i] = fgetc(open);
				i++;
			}
			send(clientsock, hc, i, 0);
			
			fclose(open);
			free(hc);
	}break;
	case 2:
	{
		char *ch;
		ch = (char *)malloc(sizeof(char)*H);
		if ((open = fopen("G:\\素材\\妖怪\\2017211146.jpg", "rb")) == NULL)
		{
			printf("cannot open!\n");
		}
		
		int i = 0;
		int d = 0;
		while (!feof(open))
		{
			ch[i] = fgetc(open);
			i++;	
		}
		printf("%d", i);
		send(clientsock, ch, i, 0);
		
		fclose(open);
		free(ch);
	}break;
	case 3:
	{
		char *mv,*g;
		mv = (char *)malloc(sizeof(char)*H);
		if ((open = fopen("G:\\mywork\\C语言第四版\\c语言视频教程\\主教程:C语言视频教程(小甲鱼)\\001第一章 C语言概述以及如何上机运行C 新版.mp4", "rb")) == NULL)
		{
			printf("cannot open!\n");
		}

		int i = 0;
		int d = 0;
		g = mv;
		while (!feof(open))
		{
			mv[i] = fgetc(open);
			if(i==1048576)
			{
			send(clientsock, mv, i, 0);
			i = -1;
			}
			i++;
		}
		Sleep(100);
		if(i>0)
		{
		send(clientsock, mv, i, 0);
		}
		fclose(open);
		//free(mv);
		printf("%d", i);
		mv = NULL;
	}break;
	}
 
	return;
}
void satrt()
{
	printf("创建中请稍后!\n");
	if (WSAStartup(funsh, &date) != 0)//初始化
	{
		printf("初始化失败%d\n", WSAGetLastError());
		system("pause");
		return;
	}
	seversock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建socket进程
	if (seversock == INVALID_SOCKET)
	{
		printf("创建失败!!!\n%d", WSAGetLastError());
		system("pause");
		return;
	}
	printf("创建成功!\n");
}
void conet()
{
	printf("loading.......\n");
	severaddr.sin_family = AF_INET;//获取地址
	severaddr.sin_port = htons(port);
	severaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//开
	if (bind(seversock, (SOCKADDR*)&severaddr, sizeof(severaddr)) == SOCKET_ERROR)//套接地址
	{
		printf("error!!!%d", WSAGetLastError());
		system("pause");
		return;
	}
	printf("成功!\n");
	if (listen(seversock, 5) == SOCKET_ERROR)//开启监听
	{
		printf("监听出错!!!\n%d", WSAGetLastError());
		system("pause");
		return;
	}
	printf("监听成功!\n");
	printf("loading.....\n");
	clientaccept = sizeof(clientaddr);
}
void jiaohu()
{
	char recever[10], recever1[10],b[2];
	int i = 0;
	while (1)
	{
		clientsock = accept(seversock, (SOCKADDR*)&clientaddr, &clientaccept);//接受客户端的连接
		if (INVALID_SOCKET != clientsock)
		{
			i++;
			printf("有用户接入第[%d]次连接\n", i);
			recv(clientsock, b, 1, 0);
			switch (bijiao(b))
			{
			case 4:
			{
			int c = recv(clientsock, recever, 11, 0);
			if (c != SOCKET_ERROR)//接受信息
			{
				printf("收到指令!\n");
				zhanhao:if (bijao(recever,a[0].id))
				{
					send(clientsock, s, strlen(s), 0);
					mi:recv(clientsock, recever1, 10, 0);
					if (bijao(recever1, a[0].power))
					{
						send(clientsock, x, strlen(x), 0);
						system("mode");
						wenjian();
						
					                                                                      	
					}
					else if (!(bijao(recever1, a[0].power)))
					{
						send(clientsock, x1, strlen(x1), 0);
						goto mi;
					}
					
				}
				else if (!(bijao(recever, a[0].id)))
				{
					send(clientsock,s1, strlen(s1), 0);
					recv(clientsock, recever, 11, 0);
					goto zhanhao;
				}
				
				printf("已断开连接!\n");
				
			}
			}break;
			case 5:
			{
				char message[] = "[Welcome to connect]!";
				char recever1[20];
				int c = recv(clientsock, recever1, 20, 0);
				if (c != SOCKET_ERROR)//接受信息
				{
					send(clientsock, message, strlen(message), 0);
				}
			}

		}
	}closesocket(clientsock);
}
}
int main()
{
	satrt();
	conet();
	jiaohu();
    closesocket(seversock);
	WSACleanup();
	system("pause");
	return 0;
}
两例代码只是使用c语言完成,如有错误还请指教。


发布了29 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/yyk219/article/details/80426320