1.文件传输
通过建立服务器客户端连接,进行文件传输。由客户端输入一个文件名,服务器搜素,查找成功后,向客户端传输数据。客户端接受在当前目录下创建文件。
// hdksjfkl.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include "iostream"
#define MAXSTRINGSIZE 9000
using namespace std;
#pragma comment (lib,"ws2_32.lib")
//获取本机IP
in_addr getHostName(void)
{
char host_name[255];
//获取本地主机名称
if (gethostname(host_name, sizeof(host_name)) == SOCKET_ERROR) {
cout<<"Error %d when getting local host name."<<WSAGetLastError();
Sleep(3000);
exit(-1);
}
//从主机名数据库中得到对应的“IP”
struct hostent *phe = gethostbyname(host_name);
if (phe == 0) {
cout<<"Yow! Bad host lookup.";
Sleep(3000);
exit(-1);
}
struct in_addr addr;
memcpy(&addr, phe->h_addr_list[0], sizeof(struct in_addr));
return addr;
}
//启动服务器
SOCKET StartServer(void)
{
//创建套接字
SOCKET serverSocket;
if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
cout<<"创建套接字失败!";
Sleep(3000);
exit(-1);
}
short port=1986;
struct sockaddr_in serverAddress;
//初始化指定的内存区域
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
serverAddress.sin_port = htons(port);
//绑定
if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
cout<<"套接字绑定到端口失败!端口:"<<port;
Sleep(3000);
exit(-1);
}
//进入侦听状态
if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR){
cout<<"侦听失败!";
Sleep(3000);
exit(-1);
}
//获取服务器IP
struct in_addr addr = getHostName();
cout<<"Server "<<inet_ntoa(addr)<<" : "<<port<<" is listening......"<<endl;
return serverSocket;
}
//接收客户端连接
SOCKET ReceiveConnect(SOCKET &serverSocket)
{
char SendBuffer[80] = {0};
int bytes;
SOCKET clientSocket;//用来和客户端通信的套接字
struct sockaddr_in clientAddress;//用来和客户端通信的套接字地址
memset(&clientAddress,0,sizeof(clientAddress));//初始化存放客户端信息的内存
int addrlen = sizeof(clientAddress);
//接受连接
if((clientSocket=accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET){
cout<<"接受客户端连接失败!";
Sleep(3000);
exit(-1);
}
cout<<"Accept connection from "<<inet_ntoa(clientAddress.sin_addr)<<endl;
sprintf(SendBuffer,"200 welcome\r\n"); //向客户端发送欢迎消息
bytes = send(clientSocket,SendBuffer,strlen(SendBuffer),0);
return clientSocket;
}
void sendfile(SOCKET &serverSocket)
{
while(1)
{
//接受客户端命令并调用处理函数
FILE * fp = NULL;
char buf[30];
char senmm[10];
memset(senmm,0,sizeof(senmm));
char sendbuf[500];
memset(sendbuf,1,sizeof(sendbuf));
char maxbuf[500];
memset(maxbuf,1,sizeof(maxbuf));
char sendmsg[50];
memset(sendmsg,0,sizeof(sendmsg));
SOCKET clientSocket = ReceiveConnect(serverSocket);
do
{
memset(buf,1,sizeof(buf));
int bytes = 0;
if((bytes = recv(clientSocket,buf,strlen(buf)+1,0)) ==SOCKET_ERROR)
{
sprintf(sendmsg,"接收数据失败");
send(clientSocket,sendmsg,strlen(sendmsg),0);
break;
}
if((fp = fopen(buf,"r")) == NULL)
{
sprintf(senmm,"文件名错误");
send(clientSocket,senmm,strlen(senmm)+1,0);
printf("客户端发来的文件名没有\n");
//printf("%d字节\n",bytes);
}
else
{
sprintf(senmm,"250");
send(clientSocket,senmm, strlen(senmm) + 1,0);
printf("客户机发来文件下载请求,文件名如下%s\n",buf);
break;
Sleep(3000);
}
}while(1);
Sleep(3000);
char MMMM[1000];
MMMM[0] = '\0';
while(fgets(maxbuf,80,fp) != NULL)
{
//循环读取文件并通过h_NewSocket发送到客户端
printf("%s\n",maxbuf);
// sprintf(sendbuf,"%s",maxbuf);
strcat(MMMM,maxbuf);
//send(clientSocket,maxbuf,strlen(maxbuf) + 1,0);
// printf(".");
// */ printf("%s",sendbuf);
}
fclose(fp);
printf("%s",MMMM);
send(clientSocket,MMMM,strlen(MMMM) + 1,0);
//sprintf(senmm,"266");
//send(clientSocket,senmm,strlen(senmm) + 1,0);
closesocket(clientSocket);
}
}
int main(int argc, char* argv[])
{
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("套接字初始化失败!!\n");
Sleep(3000);
exit(-1);
}
SOCKET serverSocket = StartServer();
sendfile(serverSocket);
return 0;
}
以上是服务器段的代码。
// hdksjfklclien.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>
#include "string.h"
using namespace std;
#pragma comment(lib,"ws2_32.lib")
//接收数据
void Receive(SOCKET socket)
{
char buf[2096];
int bytes;
if((bytes=recv(socket,buf,sizeof(buf),0))==SOCKET_ERROR){
printf("接收数据失败!\n");
exit(-1);
}
buf[bytes]='\0';
cout<<buf<<endl;
}
//获取服务器IP
unsigned long GetServerIP(void)
{
//把字符串的IP地址转化为u_long
char ipStr[20];
//用第二个参数填充第一个参数所指的内存,填充的长度为第三个参数的大小
memset(ipStr,0,sizeof(ipStr));
// cout<<"请输入你要链接的服务器IP:";
// cin>>ipStr;
strcpy(ipStr,"127.0.0.1");
unsigned long ip;
if((ip=inet_addr(ipStr))==INADDR_NONE){
cout<<"不合法的IP地址:";
Sleep(3000);
exit(-1);
}
return ip;
}
//发送数据
char path[80] = {'0'};
void SendMsg(SOCKET &sock)
{
printf("请输入要下载的文件名\n");
scanf("%s",path);
printf("%d\n",strlen(path));
if(send(sock,path,strlen(path)+1,0)==SOCKET_ERROR)
{
cout<<"发送数据失败!";
exit(-1);
}
cout<<"发送数据是"<<path<<endl;
}
//链接服务器
void CConnect(SOCKET &sock)
{
unsigned long ip=GetServerIP();
//把端口号转化成整数
short port=1986;
cout<<"Connecting to "<<inet_ntoa(*(in_addr*)&ip)<<" : "<<port<<endl;
struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr= ip;
serverAddress.sin_port = htons(port);
//建立和服务器的连接
if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
cout<<"建立连接失败:"<<WSAGetLastError();
Sleep(3000);
exit(-1);
}
}
int main(int argc, char* argv[])
{
WSADATA wsa;
//初始化套接字DLL
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
cout<<"套接字初始化失败!";
Sleep(3000);
exit(-1);
}
//创建套接字
SOCKET sock;
if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
cout<<"创建套接字失败!";
exit(-1);
}
CConnect(sock);//链接服务器
Receive(sock);
char buf[10];
while(1)
{
if((strncmp(buf,"250",strlen("250") + 1) == 0))
break;
SendMsg(sock);
recv(sock,buf,strlen(buf) + 1,0);
}
FILE *fp;
char recvbuf[1000];
memset(recvbuf,1,sizeof(recvbuf));
if((fp = fopen(path,"w+")) == NULL)
{
printf("本地打开文件错误\n");
return 0;
}
//int bytee = 0;
//printf("%s\n",recvbuf);
recv(sock,recvbuf,sizeof(recvbuf),0);
printf("%s",recvbuf);
fprintf(fp,recvbuf);
fclose(fp);
closesocket(sock);
WSACleanup();
printf("文件接收完毕\n");
return 0;
}
以上是客户端的代码。