本帖最后由 oyljerry 于 2013-01-24 18:53:37 编辑

解决方案 »

  1.   

    client端:#include <stdio.h>
    #include <windows.h>
    #include <stdlib.h>#define FILENAME 200
    #define BUFFER 1024
    #define PORT  9999
    #pragma comment(lib, "ws2_32.lib")  #define LENGTH 200
    struct FILEHEAD  //文件信息结构
    {
    char path_buffer[LENGTH]; //文件绝对路径
    char filename[LENGTH]; //文件名
    char ext[LENGTH]; //文件扩展名
    unsigned int length; //文件长度

    };FILEHEAD file; void setFileInformation()
    {
    memset(&file,0,sizeof(FILEHEAD)); 

    //_makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" );
    printf( "input the path and name : \n");
    scanf("%s",file.path_buffer);
    _splitpath( file.path_buffer, NULL, NULL, file.filename, file.ext );

    FILE *fp= NULL;
    fp=fopen(file.path_buffer,"r");
    if (NULL==fp)
    {
    printf("cannot open the %s \n",file.path_buffer);
    exit(0);
    }

    fseek(fp,0l,SEEK_END);
    file.length=ftell(fp);

    //fclose(fp);
    //fp = NULL; //需要指向空,否则会指向原打开文件地址

    printf( "file head information:\n" );
    //printf( "  Drive: %s\n", drive );
    //printf( "  Dir: %s\n", dir );
    printf( "  Filename: %s\n", file.filename );
    printf( "  Ext: %s\n", file.ext );
    printf( "  length is btye: %ld btye\n", file.length );
    }int main(int argc, char *argv[])
    {
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2,0),&wsadata);
    SOCKET sock_trans=socket(AF_INET,SOCK_STREAM,0);

    if (sock_trans==0)
    {
    printf ("socket build faile!!\n");
    exit(1);
    }

    printf ("target pc's IP address: 127.0.0.1\n");

    //如果正式调试,将服务器端ip写死。

    SOCKADDR_IN sockadd;
    sockadd.sin_family=AF_INET;
    sockadd.sin_port=htons(PORT);
    sockadd.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

    int con_info=connect(sock_trans,(SOCKADDR*)&sockadd,sizeof(sockadd));

    if (con_info==SOCKET_ERROR)
    {
    printf ("connect fail!\n");
    //exit(2);
    }

    Sleep(1000);

    setFileInformation(); FILE *fp;
    fp=fopen(file.path_buffer,"rb");
    if (fp==NULL)
    {
    perror("\nopen file error:");
    exit(1);
    }

    //freed_return_val=fread(buf,1,1024,fp);//读文件字符
    char buf[BUFFER];
    int fread_return_val=0;//文件读出字符的返回值 //发送文件头信息
    printf("发送文件头信息...\n");
    send(sock_trans,(char *)&file,sizeof(file),0); printf("发送文件信息...\n");
    while (1)
    {
    fread_return_val=fread(buf,1,1024,fp);
    if (0==fread_return_val)
    {
    break;
    }
    //freed_return_val=fread(buf,1,1024,fp);
    send(sock_trans,buf,fread_return_val,0);
    printf(".");
    }

    fclose(fp);

    closesocket(sock_trans);
    WSACleanup();
    printf("\n发送完成...\n");

    return 0;

    }
      

  2.   

        while (1)     {     
    SOCKET connect;       //循环等待 
        if ((connect=accept(socklisten,(sockaddr *)&clientaddr,&client_addr_length))==INVALID_SOCKET)         {             printf("accept failed!!\n");             closesocket(connect);             WSACleanup();             return -1;         }           //创建新线程         DWORD ThreadID;         CreateThread(NULL,0,RequestThread,(LPVOID)connect,0,&ThreadID);     } 
    这样也还是存在断开的问题啊