VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 843|回复: 2

tcp/ip服务器端给客户端发送文件失败,各位大牛帮忙看看

[复制链接]
91_avatar_middle
最佳答案
0 
在线会员 发表于 2016-3-25 17:37:47 | 显示全部楼层 |阅读模式
3驿站币
//服务器端
#include<stdio.h>
#include<windows.h>
#pragma comment (lib,"ws2_32.lib")

#define FILE_NAME_MAX_SIZE 50

int main(void)
{        
        //winsock库的初始化
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2, 2), &wsadata);
   
        //创建服务器端的套接字
        SOCKET sockSer;
    sockSer = socket(AF_INET, SOCK_STREAM, 0);
     
        //声明服务器端的端点地址,客户端的端点地址
    SOCKADDR_IN addrSer,addrCli;
        //配置服务器的端点地址
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(5050);
    addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
               
        //服务器端的套接字与服务器端的端点地址绑定
    bind(sockSer, (SOCKADDR*)&addrSer, sizeof(addrSer));
    //监听
    listen(sockSer, 5);
     
        //用于发送接收数据的套接字
    SOCKET sockConn;
    int len = sizeof(SOCKADDR);

    char file_name[FILE_NAME_MAX_SIZE+1]="C:\\Users\\john\\Desktop\\1.txt";
        //printf("enter file name:);
        //scanf("%s",file_name);
   
    FILE * fp = fopen(file_name, "r"); //windows下是"rb",表示打开一个只读的二进制文件
        if (NULL == fp)   
        {     
                printf("File: %s Not Found\n", file_name);  
    }   
       
   
        while(1)
        {
        printf("server wait...\n");
        sockConn = accept(sockSer, (SOCKADDR*)&addrCli,&len);
      
        if (sockConn == INVALID_SOCKET)
        {
                printf( "Server Accept Client Connect Fail\n");
                return 0;
        }
        else
        {
                printf("Server Accept ClIent Connect success\n");
        }
       
        char sendbuf[1024];
        memset(sendbuf, 0, sizeof(sendbuf));   

        int length = 0;      
        while ((length = fread(sendbuf, sizeof(char),sizeof(sendbuf), fp)) > 0)   
                {         
                    if (send(sockConn, sendbuf, sizeof(sendbuf), 0) < 0)      
                        {           
                           printf("Send File: Failed\n");      
                           break;      
                        }                  
                }
                printf("send file success\n");
        }

        fclose(fp);
        closesocket(sockSer);
        WSACleanup();        
        return 0;
}
//客户端
#include<stdio.h>
#include<Windows.h>
#pragma comment (lib,"ws2_32.lib")


int main()
{
        WSADATA wsadata;
        WSAStartup(MAKEWORD(2, 2), &wsadata);

        SOCKET sockCli;
        sockCli = socket(AF_INET, SOCK_STREAM, 0);

        SOCKADDR_IN addrSer;
        addrSer.sin_family = AF_INET;
        addrSer.sin_port = htons(5050);
        addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        
        int res = connect(sockCli, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));
        if (res != 0)
        {
                printf("Clinet Connect Server Fail!\n");
                return 0;
        }
        else
        {
                printf("Clinet Connect Server Success\n");
        }
        
                //接收数据
        
        char recvbuf[256];
                memset(recvbuf,0,sizeof(recvbuf));
        
                FILE* fh = fopen("C:\\Users\\john\\Desktop\\2.txt","w");

        int length = 0;
        while ((length = recv(sockCli, recvbuf, sizeof(recvbuf), 0)) > 0)   
                {   
                        if( length < 0)
                        {
                                printf("recv fail\n");

                        }
                        printf("%d\n",length);
                        printf("recv file\n");
                        if (fwrite(recvbuf, sizeof(char), length, fh) < length)   
                        {         
                                printf("File Write Failed\n");      
                break;   
                        }      
                        memset(recvbuf, 0, sizeof(recvbuf));   
                }

        printf("Receive File:  From Server Successful!\n");
        fclose(fh);   
        closesocket(sockCli);
        WSACleanup();
        return 0;
}





上一篇:VC控件关联变量如何在自定义函数使用
下一篇:有个时间问题,希望广大道友前来交流
51_avatar_middle
最佳答案
82 
online_admins 发表于 2016-3-28 16:07:48 | 显示全部楼层
没有调试代码,发现了2个问题:
1、发送端可能发送的比较快,发完了马上就closesocket关闭套接字了,这时候对方可能还没接收完,所以就接收到错误了;
2、由于网络环境的关系,发送方有时候不能把你交给他的数据一次性发送完成,这时候就要循环发送,接收方也是一样的道理。
47_avatar_middle
最佳答案
0 
在线会员 发表于 2016-3-29 11:57:31 | 显示全部楼层
老大有现成的网络模型,拿来套用下就能解决你的问题
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-30 15:09

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表