一个简单的在本地传输文件的网络程序(二)

2014-11-24 09:13:47 · 作者: · 浏览: 1
ten);
if(which == 3)
closesocket(sock_accept);
}
WSACleanup();
}
客户端代码:

[cpp]
#include
#pragma comment(lib,"ws2_32.lib")

#define IP "127.0.0.1"
#define PORT 6666

struct PacketHeader
{
char code[10]; // 指令:"EOF"=断开连接 "PIC"=接收图片
char name[50]; // 名字:包括后缀
LONG32 size; // 大小:字节
PacketHeader()
{
memset(code,0,sizeof(code));
memset(name,0,sizeof(name));
size = 0;
}
};

void client()
{
WSADATA wd;
int ret = WSAStartup(MAKEWORD(2,2),&wd);
if(ret != 0)
{
cout<<"Initialize Winsock Failed! "< return;
}
cout<<"WSAStartup OK"<
sockaddr_in addr_serv;
int sock;
try{
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock == SOCKET_ERROR)
{
cout<<"create socket failed! "< throw 1;
}
cout<<"socket OK"<
memset((void*)&addr_serv,0,sizeof(sockaddr));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.S_un.S_addr = inet_addr(IP);
addr_serv.sin_port = htons(PORT);

ret = connect(sock,(sockaddr*)&addr_serv,sizeof(addr_serv));
if(ret == SOCKET_ERROR)
{
cout<<"connect failed! "< throw 2;
}
cout<<"connect OK"<


char buffer[1024];
while(true)
{
int nRecv = recv(sock,buffer,1024,0);
if(nRecv <= 0)
continue;
else if(nRecv == sizeof(PacketHeader))
{
PacketHeader ph;
memcpy_s(&ph,sizeof(ph),buffer,nRecv);
if(strcmp(ph.code,"EOF") == 0)
break;
else if(strcmp(ph.code,"PIC") == 0)
{
cout<<"文件名:"< FILE* fp = NULL;
fopen_s(&fp,ph.name,"wb");
if(fp == NULL)
{
cout<<"创建文件失败"< break;
}
else
{
nRecv = 0;
while(nRecv < ph.size)
{
int nBytes = recv(sock,buffer,1024,0);
if(nBytes <= 0)
break;
cout<<"已接收 "< fwrite(buffer,sizeof(char),nBytes,fp);
nRecv += nBytes;
}
cout<<"共接收 "< fclose(fp);
}
}
else
{
cout<<"头部信息错误"< break;
}
}
else
{
buffer[nRecv] = '\0';
cout< }
}
closesocket(sock);
}catch(int which){
if(which == 2)
closesocket(sock);
}
WSACleanup();
}
运行截图: