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! "<
}
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! "<
}
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! "<
}
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<<"文件名:"<
fopen_s(&fp,ph.name,"wb");
if(fp == NULL)
{
cout<<"创建文件失败"<
}
else
{
nRecv = 0;
while(nRecv < ph.size)
{
int nBytes = recv(sock,buffer,1024,0);
if(nBytes <= 0)
break;
cout<<"已接收 "<
nRecv += nBytes;
}
cout<<"共接收 "<
}
}
else
{
cout<<"头部信息错误"<
}
}
else
{
buffer[nRecv] = '\0';
cout<
}
closesocket(sock);
}catch(int which){
if(which == 2)
closesocket(sock);
}
WSACleanup();
}
运行截图: