首先是客户端代码
图实现的是网页资源的下载
#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语言完成,如有错误还请指教。