server端
#include "Winsock2.h"
#include <iostream>
#include <fstream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
void main(int argc,char **argv)
{
WSADATA wsaData;
int err;
err = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if ( err != 0 )
{
return;
}
int servfd,clifd;
int len;
char buf[256];
struct sockaddr_in serv,cli,test;
serv.sin_family = AF_INET;
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_port=htons(10000);
servfd=socket(AF_INET,SOCK_STREAM,0);
bind(servfd,(struct sockaddr *)&serv,sizeof(struct sockaddr_in));
listen(servfd,SOMAXCONN);
for(;;)
{
len=sizeof(SOCKADDR);
getsockname(servfd,(sockaddr *)&test,&len);
cout<<inet_ntoa(test.sin_addr)<<endl;
clifd=accept(servfd,(sockaddr *)&cli,&len);
recv(clifd,buf,sizeof(buf),0);
int i=atoi(buf);
int rec=0;
char pFileName;
ofstream f;
f.open("f://1.mp3",ios_base::binary);
for(int j=0;j<i;j++)
{
memset(&pFileName,0,sizeof(pFileName));
rec= recv(clifd,&pFileName,1,0);
if(rec!= SOCKET_ERROR )
{
cout<<"good!"<<endl;
f.write(&pFileName,rec);
}
else
{
cout<<"error!"<<endl;
break;
}
}
}
closesocket(clifd);
}
客户端
#include "Winsock2.h"
#include "iostream.h"
#include <Mswsock.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#pragma comment(lib,"Mswsock.lib")
#pragma comment(lib,"ws2_32.lib")
void main(int argc,char **argv)
{
WSADATA wsaData;
int err;
err = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if ( err != 0 )
{
return;
}
int servfd;
char buf[256];
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_addr.s_addr=inet_addr("192.168.142.181");
serv.sin_port=htons(10000);
servfd=socket(AF_INET,SOCK_STREAM,0);
//bind(servfd,(struct sockaddr *)&serv,sizeof(serv));
struct stat statbuf;
stat("d://1.mp3", &statbuf);
char buf1[256];
sprintf(buf1,"%ld",statbuf.st_size);
cout<<buf1<<endl;
connect(servfd,(sockaddr *)&serv,sizeof(serv));
send(servfd,buf1,sizeof(buf1),0);
while(true)
{
HANDLE hFile = CreateFile("d://1.mp3", GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
TransmitFile(servfd,hFile,0,1024,NULL,NULL,TF_REUSE_SOCKET|TF_DISCONNECT);
cin>>buf;
send(servfd,buf,sizeof(buf),0);
cout<<inet_ntoa(serv.sin_addr);
}
closesocket(servfd);
}
-----------------------------------------------------------------------------------------------
改为了线程还是没用!
#include "Winsock2.h"
#include <iostream>
#include <fstream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
typedef struct parm
{
SOCKET s;
int i;
}Parm;
DWORD WINAPI ClientThread(LPVOID parm1)
{
Parm *parm;
parm =(Parm *)parm1;
SOCKET clifd=parm->s;
int i=parm->i;
char pFileName;
cout<<i<<endl;
ofstream f;
f.open("f://1.avi",ios_base::binary);
cout<<"recv..";
int rec=0;
for(int j=0;j<i;j++)
{
memset(&pFileName,0,sizeof(pFileName));
rec= recv(clifd,&pFileName,1,0);
if(rec!= SOCKET_ERROR )
{
if(j%1000==0)
cout<<".";
f.write(&pFileName,rec);
}
else
{
cout<<"error!"<<endl;
break;
}
}
cout<<"end sending!"<<endl;
return 0;
}
void main(int argc,char **argv)
{
WSADATA wsaData;
HANDLE hThread;
DWORD dwThreadId;
int err;
err = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if ( err != 0 )
{
return;
}
int servfd,clifd;
int len;
char buf[256];
struct sockaddr_in serv,cli,test;
serv.sin_family = AF_INET;
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_port=htons(10000);
servfd=socket(AF_INET,SOCK_STREAM,0);
bind(servfd,(struct sockaddr *)&serv,sizeof(struct sockaddr_in));
listen(servfd,SOMAXCONN);
for(;;)
{
len=sizeof(SOCKADDR);
getsockname(servfd,(sockaddr *)&test,&len);
cout<<inet_ntoa(test.sin_addr)<<endl;
clifd=accept(servfd,(sockaddr *)&cli,&len);
recv(clifd,buf,sizeof(buf),0);
int i=atoi(buf);
Parm *parm = new Parm;
parm->s=clifd;
parm->i=i;
hThread=CreateThread(NULL,0,ClientThread,(LPVOID)parm,0,&dwThreadId);
}
closesocket(clifd);
}