首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

自己写的SOCKET文件传输客户端和服务端 客户端开两次服务端才有反应解决办法

2012-04-23 
自己写的SOCKET文件传输客户端和服务端 客户端开两次服务端才有反应自己写的服务端和客户端用途是获得远程

自己写的SOCKET文件传输客户端和服务端 客户端开两次服务端才有反应
自己写的服务端和客户端 用途是获得远程服务器上指定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 50char* 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 50int 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;} 



[解决办法]
字符串'\0'结尾。
[解决办法]
服务器的
while (1)
{
开头加 memset(reBuffer,0,sizeof(reBuffer));

[解决办法]
m_client = accept(m_sock,(SOCKADDR*)&remoteAddr,&nAddrLen);
if ((m_client = accept(m_sock,(SOCKADDR*)&remoteAddr,&nAddrLen)) == INVALID_SOCKET)
{
cout<<"Failed accept()"<<endl;
continue;
}

汗。。

热点排行