自己写的SOCKET文件传输客户端和服务端 客户端开两次服务端才有反应解决办法
自己写的SOCKET文件传输客户端和服务端 客户端开两次服务端才有反应
自己写的服务端和客户端 用途是获得远程服务器上指定PATH的文件
除了2个初始化WSA和清空WSA的东西之外没有依赖其他文件
打开服务端之后 必须打开2次客户端 服务端才有反应 但是服务端获得的文件PATH有问题
(找寻文件rest123.txt烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫......蘾)
自己检查客户端之后发现顺序没有问题 哪位可以帮忙排一下错
SERVER:
Client:
自己写的服务端和客户端 用途是获得远程服务器上指定PATH的文件
除了2个初始化WSA和清空WSA的东西之外没有依赖其他文件
打开服务端之后 必须打开2次客户端 服务端才有反应 但是服务端获得的文件PATH有问题
(找寻文件rest123.txt烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫......蘾)
自己检查客户端之后发现顺序没有问题 哪位可以帮忙排一下错
SERVER:
- C/C++ code
#include <iostream> #include <WinSock2.h> #include "sock_op.h" using namespace std; #define SOCK_BUFFER_LENGTH 4096 #define BUFFER_LENGTH 50 char* FindIp (char* IpAddr); int main () { int Ret; InitSockLib(); //创建套接字 SOCKET m_sock = socket (AF_INET , SOCK_STREAM , IPPROTO_TCP); if (m_sock == INVALID_SOCKET) { cout <<"Failed socket () " << endl; return 0; } //填充地址结构 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons (4567); sin.sin_addr.S_un.S_addr = INADDR_ANY; //绑定套接字 if (bind (m_sock,(LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { cout << "Faild bind() "<<endl; return 0; } cout<<"bind OK"<<endl; //开始监听 if(listen(m_sock,5) == SOCKET_ERROR) { cout<<"Failed listen()"<<endl; return 0; } cout<<"Listening start"<<endl; //循环接受连接请求 sockaddr_in remoteAddr; int nAddrLen = sizeof(remoteAddr); SOCKET m_client; char reBuffer[SOCK_BUFFER_LENGTH]; char* temp; while (1) { cout<<"进入循环"<<endl; //接受新连接 m_client = accept(m_sock,(SOCKADDR*)&remoteAddr,&nAddrLen); if ((m_client = accept(m_sock,(SOCKADDR*)&remoteAddr,&nAddrLen)) == INVALID_SOCKET) { cout<<"Failed accept()"<<endl; continue; } cout<<"接受到一个新的连接: "<<inet_ntoa(remoteAddr.sin_addr)<<"\r\n"<<endl; //接受请求 recv(m_client,reBuffer,strlen(reBuffer),0); temp = reBuffer+strlen(reBuffer); *temp = '\0'; cout<<"找寻文件"<<reBuffer<<endl; //搜索文件 char fileBuffer[SOCK_BUFFER_LENGTH]; char buffer[BUFFER_LENGTH]=""; char fileError[ BUFFER_LENGTH]="文件不存在"; FILE *fp; int k=0,l=0; if ((fp=fopen(reBuffer,"rb"))==NULL) { strcpy (buffer,fileError); cout<<buffer<<endl; } while (!feof(fp)) { k=fread(fileBuffer,1,SOCK_BUFFER_LENGTH,fp); send(m_client,fileBuffer,k,0); l+=k; } cout<<"文件已发送"<<l<<"比特"<<endl; //关闭文件句柄 fclose(fp); } //关闭客户端连接 closesocket (m_client); //关闭主循环套接字 closesocket(m_sock); DestroySockLib(); return 0; }
Client:
- C/C++ code
#include <iostream> #include <WinSock2.h> #include "sock_op.h" using namespace std; #define SOCK_BUFFER_LENGTH 4096 #define BUFFER_LENGTH 50 int main (int argc,char* argv[]) { int Ret; if (argc < 3) { cout<<"Usage: "<<argv[0]<<" ServerIP Path"<<endl; return 1; } char b1[BUFFER_LENGTH]="\0"; InitSockLib(); //创建套接字 SOCKET m_sock = socket (AF_INET , SOCK_STREAM , IPPROTO_TCP); if (m_sock == INVALID_SOCKET) { cout <<"Failed socket () \n" << endl; return 0; } //填充地址结构 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(4567); sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //绑定套接字 // if (bind (m_sock,(LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) // { // cout << "Faild bind() \n"<<endl; // return 0; // } //发送连接请求 char fileBuffer[SOCK_BUFFER_LENGTH]; FILE *fp; //接受新连接 if (connect(m_sock,(SOCKADDR*)&sin,sizeof(sin))== INVALID_SOCKET) { cout<<"Failed connect()"<<endl; return 0; } send(m_sock,argv[2],strlen(argv[2]),0); //接受请求 while (1) { recv(m_sock,fileBuffer,strlen(fileBuffer),0); if ((fp=fopen("down.txt","wb"))==NULL) fwrite(fileBuffer,1,SOCK_BUFFER_LENGTH,fp); } //关闭文件句柄 fclose(fp); //关闭套接字 closesocket(m_sock); DestroySockLib(); return 0; }