C++winsock编程高分求教

西木凌萧 2012-05-09 10:21:47
// server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"
#include"Winsock.h"
#include"windows.h"
#include"stdio.h"
#include <direct.h>
#include <stdlib.h>
#include <io.h>
#pragma comment(lib,"wsock32.lib")
#define RECV_PORT 2000
#define SEND_PORT 3000
#define MAX_FILESIZE 32*1024
SOCKET sock,sockl;
sockaddr_in ServerAddr;
sockaddr_in ClientAddr;
struct Filedata
{
char ffname[30];
char ffdata[MAX_FILESIZE];
int len;}DataPacket;

int Addrlen;
DWORD StartSock()
{
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
{
printf("sock初始化失败!\n");
return(-1);
}
return(1);}
DWORD CreateSocket()
{
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==SOCKET_ERROR)
{
printf("sock创建失败!\n");
WSACleanup();
return(-1);
}
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);
ServerAddr.sin_port=htons(RECV_PORT);
if(bind(sock,(struct sockaddr FAR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{ printf("绑定出错");
return(-1);
}
return(1);}
DWORD WriteFile2(char*fname,char*fdata,int flen)
{
int i;
FILE *fp;
fp=fopen(fname,"wb");
if(fp==NULL)
{
printf("不能打开文件\n");}
i=0;
for(i=0;i<flen;i++)
{
fputc(fdata[i],fp);
}
fclose(fp);
return(1);
}
int SerchFile(char *to_search) //serch file function
{
long handle; //用于查找的句柄
struct _finddata_t fileinfo; //文件信息的结构体
handle=_findfirst(to_search,&fileinfo); //第一次查找
if(-1==handle)
return -1;
printf("%s\n",fileinfo.name); //打印出找到的文件的文件名
while(!_findnext(handle,&fileinfo)) //循环查找其他符合的文件,知道找不到其他的为止
{
printf("%s\n",fileinfo.name);
}
_findclose(handle); //别忘了关闭句柄

return 0;
}
DWORD ConnectProcess()
{ //char fname[300];
Addrlen=sizeof(sockaddr_in);
if(listen(sock,5)<0)
{ printf("监听出错");
return(-1);
}
printf("监听...\n");
for(;;)
{
sockl=accept(sock,(struct sockaddr FAR*)&ClientAddr,&Addrlen);
for(;;)
{ memset(DataPacket.ffname,0,30);
memset(DataPacket.ffdata,0,MAX_FILESIZE);
DataPacket.len=0;
if(recv(sockl,(char*)&DataPacket,sizeof(DataPacket),0)<=0)
{
break;
}
printf("已经接收到文件:%s\n",DataPacket.ffname);
printf("文件大小:%d\n",DataPacket.len);

WriteFile2(DataPacket.ffname,DataPacket.ffdata,DataPacket.len);
printf("\n");
}
}
}
int main()
{ if(StartSock()==-1)
return(-1);
if(CreateSocket()==-1)
return(-1);
//先检索服务器发来的文件目录,然后检索目录列出所有的文件返回给客户端,然后再次接受客户端发来的文件名,再将此文件发给客户端。
/*if(ConnectProcess()==-1)
return(-1);
*/
return(1);}



// client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"Winsock.h"
#include"windows.h"
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#pragma comment(lib,"wsock32.lib")
#define RECV_PORT 1024//接受数据端口
#define SEND_PORT 1025//发送数据端口
#define MAX_FILESIZE 32*1024//最大文件长度
SOCKET sock;
sockaddr_in ServerAddr;

struct Filedata
{ char ffname[30];
char ffdata[MAX_FILESIZE];//文件大小
int len;//长度
}DataPacket;



DWORD StartSock()
{ WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
{ printf("sock初始化失败!\n");
return(-1);}
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
ServerAddr.sin_port=htons(RECV_PORT);//接受数据的端口
return(1);}




DWORD CreateSocket()
{ sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==SOCKET_ERROR)
{ printf("sock创建失败!\n");
WSACleanup();
return(-1);}
return(1);}



void CallServer()
{ CreateSocket();
while(connect(sock,(struct sockaddr*)&ServerAddr,
sizeof(ServerAddr))==SOCKET_ERROR)
{printf("连接...\n");}}



DWORD GetFile(char*fname)
{
FILE*fp;
int Filesize;
int i;
int count,total=0;
char buffer[100];
char Senddata[MAX_FILESIZE];
fp=fopen(fname,"rb");
if(fp==NULL)
{
printf("不能打开文件\n");
return(0);
}
i=0;
Filesize=0;
memset(Senddata,0,MAX_FILESIZE);
while(!feof(fp)) {
count=fread(buffer,sizeof(char),100,fp);/
if(ferror(fp))
{
printf("读文件出错");
break;
}
Filesize+=count;
if(Filesize>MAX_FILESIZE)
{
printf("文件太大\n");
fclose(fp);
return(0);
}
memcpy(&Senddata[i],buffer,count);
}
fclose(fp);
Senddata[i]='\0';
strcpy(DataPacket.ffname,fname);
memcpy(DataPacket.ffdata,Senddata,Filesize);
i+=count;
DataPacket.len=Filesize;
printf("%s\n",DataPacket.ffname);
printf("%d\n",DataPacket.len);
return(1);
}
DWORD TCPSendPacket(struct Filedata Packet)
{
int length;
length=send(sock,(char*)&Packet,sizeof(DataPacket),0);
if(length<=0)
{ printf("发送数据失败!\n");
closesocket(sock);
WSACleanup();
return(-1);
}
return(1);
}
int main()
{ char sendfilename[30];
StartSock();
CallServer();
printf("连接成功!\n");
//求代码 功能 输入服务器机器中某个文件夹目录 列出其中所有的文件返回给客户机 然后客户机在此输入文件名发给服务端,然后按后服务器端将文件发过来,保存在客户端本地。
closesocket(sock);
return(0);
}

...全文
95 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
W170532934 2012-05-09
  • 打赏
  • 举报
回复
各种错误。
if(recv(sockl,(char*)&DataPacket,sizeof(DataPacket),0)<=0)

if(fp==NULL)
{
printf("不能打开文件\n");}
为什么不直接return -1???
「已注销」 2012-05-09
  • 打赏
  • 举报
回复
看到
if(recv(sockl,(char*)&DataPacket,sizeof(DataPacket),0)<=0)

就不必再看下去了,已经错了。

recv 不止会提示错误(-1),还会返回实际所收到的字节数量。必须接受这个返回值,继续操作。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧