海阔天空

海阔凭鱼跃 天高任鸟飞

 

转:socket传输文件例子

在网上看到一个socket传文件的例子,记下来,还有优化的空间。

 

客户端 发送文件:

#include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsa; WSAStartup(MAKEWORD(2,2),&wsa); SOCKET sock=socket(AF_INET,SOCK_STREAM,0); if(sock==INVALID_SOCKET) { printf("socket error\n"); return 0; } SOCKADDR_IN local; char server[20]; //printf("请输入IP地址:"); //scanf("%s",server); memcpy(server,"127.0.0.1",sizeof("127.0.0.1")); char filePath[50]; printf("请输入文件路径:"); scanf("%s",filePath); HANDLE fp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); while(fp==INVALID_HANDLE_VALUE) { printf("文件路径错误,请重新输入:"); scanf("%s",filePath); fp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); } printf("%s\n",filePath); DWORD fileLen=GetFileSize(fp,&fileLen); printf("你选择的文件大小为:%u字节\n",fileLen); local.sin_addr.S_un.S_addr=inet_addr(server); local.sin_family=AF_INET; local.sin_port=htons(10000); if(connect(sock,(SOCKADDR*)&local,sizeof(SOCKADDR))==SOCKET_ERROR) { printf("connect error:%i\n",WSAGetLastError()); return 0; } char* buffer=new char[fileLen]; DWORD bufferLen=0; //读取文件到缓存中 ReadFile(fp,buffer,fileLen,&bufferLen,NULL); bool isFirst=true;//第一次发送 int sendLen=0;//实际发送数据的长度 char sendBuffer[200];//发送帧 int sendedLen=0;//当前已发送的文件长度 int leftLen=fileLen;//当前剩下的文件长度 while(true) { if(isFirst) { sendLen=send(sock,"~",1,0); isFirst=false; if(sendLen<0) { printf("第一帧发送失败,程序结束\n"); return 0; } Sleep(1000); continue; } if((leftLen<=0)||(sendedLen>=fileLen))//剩下长度为0或当前已发送长度为文件长则退出 break; if(leftLen>=200) { memcpy(sendBuffer,buffer+sendedLen,200); sendLen=send(sock,sendBuffer,200,0); if(sendLen<0) { printf("帧发送失败,程序结束\n"); return 0; } } else { memcpy(sendBuffer,buffer+sendedLen,leftLen); sendLen=send(sock,sendBuffer,leftLen,0); if(sendLen<0) { printf("帧发送失败,程序结束\n"); return 0; } Sleep(1000); send(sock,"#",1,0); } sendedLen+=sendLen; leftLen=fileLen-sendedLen; printf("已经发送:%d字节\n",sendedLen); } if(sendedLen==fileLen) { printf("文件发送成功\n"); } else printf("文件发送失败\n"); closesocket(sock); WSACleanup(); delete[] buffer; return 0; }

 

 

服务端 接收文件:

#include <winsock2.h> #include <stdio.h> #include <string.h> #include <windows.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsa; WSAStartup(MAKEWORD(2,2),&wsa); SOCKET sock=socket(AF_INET,SOCK_STREAM,0); if(sock==INVALID_SOCKET) { printf("socket error\n"); return 0; } SOCKADDR_IN local; local.sin_addr.S_un.S_addr=INADDR_ANY; local.sin_family=AF_INET; local.sin_port=htons(10000); if(bind(sock,(SOCKADDR*)&local,sizeof(SOCKADDR))==SOCKET_ERROR) { printf("%i\n",WSAGetLastError()); return 0; } if(listen(sock,5)==SOCKET_ERROR) { printf("%i\n",WSAGetLastError()); return 0; } printf("listen...\n"); SOCKADDR_IN client; SOCKET clientSock; int addrLen=sizeof(SOCKADDR); HANDLE thread; clientSock=accept(sock,(SOCKADDR*)&client,&addrLen); printf("welcome:%s\n",inet_ntoa(client.sin_addr)); int recvLen=0;//收到的缓冲的长度 int recvedLen=0;//当前已经收到的长度 DWORD writeLen;//实际写入文件的长度 int fileLen=0;//文件长度 char* buffer;//文件缓冲 char recvBuffer[200];//接收缓冲区 buffer=new char[1024*1024*10]; recvLen=recv(clientSock,recvBuffer,200,0); if(recvBuffer[0]=='~') { printf("开始接收文件\n"); memset(recvBuffer,0,200); } while(true) { recvLen=recv(clientSock,recvBuffer,200,0); if((recvLen==1)&&(recvBuffer[0]=='#')) break; memcpy(buffer+recvedLen,recvBuffer,recvLen); recvedLen+=recvLen; printf("接收:%d\n",recvLen); printf("已经接收%i字节数据\n",recvedLen); } HANDLE fp=CreateFile("d:\\test2.temp",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(fp,buffer,recvedLen,&writeLen,NULL); printf("写入文件长度:%u\n",writeLen); delete[] buffer; WSACleanup(); return 0

} 

posted on 2010-04-26 17:19  liuym  阅读(5532)  评论(5)    收藏  举报

导航