2 qq 27598289 qq_27598289 于 2015.07.12 13:29 提问

有关ege和udp的问题,新手求大神,

我做的udp文件传输,在dos界面下服务端可以接收到来自客户端的文件,但我加上ege界面之后,发现服务端收不到了
这个是dos界面的服务端的接收函数
int file()
{

int err = INVALID_VALUE32;
WORD ver;
WSADATA wsaData;
int result;

ver = MAKEWORD(2, 2);  


err = WSAStartup(ver, &wsaData);
if (err != 0)   
{

    return 0;

}
if ((LOBYTE(wsaData.wVersion) != 2) || (HIBYTE(wsaData.wVersion) != 2))
{ 

    WSACleanup(); 
    return 0;

}
sockSc = socket(AF_INET, SOCK_DGRAM, 0); 
SOCKADDR_IN addrSc;
addrSc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);;
addrSc.sin_family = AF_INET;
addrSc.sin_port = htons(7861); 
result=bind(sockSc, (SOCKADDR*)&addrSc, sizeof(SOCKADDR)); 
DWORD ID;
HANDLE handle=CreateThread(NULL,0,recvfunc,0,0,&ID);
while(recvexi<2)
{

  Sleep(100);

}

printf("退出成功\n");
return 0;
}
char TcharToChar(const TCHAR *tchar,char *_char)
{
int ilength;
ilength = WideCharToMultiByte(CP_ACP,0,tchar,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,tchar,-1,_char,ilength,NULL,NULL);
return *_char;
}//WCHAR到char类型的转换

DWORD WINAPI recvfunc(LPVOID lpParam)
{
recvexi=1;
FILE *p;
char name[5200];
char name1[5200];
getchar();
printf("请输入你想要接收的文件路径:\n");
gets_s(name);
fopen_s(&p,name,"wb");
while(recvexi==1)
{

    int rec=recvfrom(sockSc,(char *)(&data),2048,0,(sockaddr*)&server,&lenth);
    if(rec>0)
    {
        if(data.head.id=id)
        {
            fwrite(data.buf,sizeof(char),data.bufsize,p);
            recvsize=recvsize+data.bufsize;

            filesize = data.head.size;
            datahead.id = data.head.id;
            datahead.recvsize = recvsize;
            datahead.size = filesize;
            int d = sendto(sockSc,(char*)(&datahead),
            sizeof(datahead),0,(sockaddr*)&server,lenth);
            id = id+1;
        }

         else if(data.head.id < id)
         {

             datahead.id = data.head.id;
             datahead.recvsize=recvsize;
             datahead.size = filesize;
             int d = sendto(sockSc,(char*)(&datahead),
             sizeof(datahead),0,(sockaddr*)&server,lenth);

         }
           if(filesize == recvsize)
           {
               datahead.id=data.head.id;
               datahead.recvsize=-1;
               datahead.size=filesize;
               printf("filesize=%d\n",filesize);
               printf("recvsize=%d\n",recvsize);
               printf("文件已经收到了!");
               int d=sendto(sockSc,(char*)(&datahead),
               sizeof(datahead),0,(sockaddr*)&server,lenth);
               recvexi = 2;
               system("pause");
               break;
           }

        }
    }
   fclose(p);
   recvexi = 2;
   _tsystem(TEXT("pause"));
   return 0;

}//文件接收线程的具体使用
这个是加上ege之后的服务端的文件接收函数
int file()//文件传输函数
{
post();
system("pause");
outtextxy(300,300,silePath);
int err = INVALID_VALUE32;
WORD ver;
WSADATA wsaData;
int result;

ver = MAKEWORD(2, 2);  
err = WSAStartup(ver, &wsaData);//Windows异步套接字)的启动命令

if ( 0 != err )  // 判断函数返回值
{
    return 0;
}

if ( (2 != LOBYTE(wsaData.wVersion))//是取得16进制数最低(最右边)那个字节的内容
    || 2 != (HIBYTE(wsaData.wVersion)) )//取得16进制数最高(最左边)那个字节的内容
{ 
    WSACleanup(); //中止Windows Sockets在所有线程上的操作

    return 0;
}



sockSc = socket(AF_INET, SOCK_DGRAM, 0); 
addrSc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSc.sin_family           = AF_INET;
addrSc.sin_port             = htons(7861); 
result=bind(sockSc, (SOCKADDR*)&addrSc, sizeof(SOCKADDR)); 
DWORD ID;
HANDLE handle = CreateThread(NULL, 0, recvfunc, 0, 0, &ID);//创建文件接收线程
while( 2 > recvexi )
{
  Sleep(100);
}

printf("退出成功\n");

return 0;

}
char TcharToChar(const TCHAR *tchar,char *_char)//WCHAR到CHAR类型的转换
{
int ilength;
ilength = WideCharToMultiByte(CP_ACP, 0, tchar,-1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, ilength, NULL, NULL);

return *_char;

}

DWORD WINAPI recvfunc(LPVOID lpParam)//文件接收具体线程
{
recvexi=1;
FILE *p;

p = fopen(silePath,"wb");
outtextxy(300,300,silePath);

while( 1 == recvexi )
{   

    int rec = recvfrom(sockSc, (char *)(&data), 2048, 0, (sockaddr*)&server, &lenth);//接收到消息
    if( 0 < rec )
    {

        if( data.head.id = id )
        {
            fwrite(data.buf, sizeof(char), data.bufsize, p);//二进制流格式写入文件
            recvsize = recvsize + data.bufsize;         
            filesize = data.head.size;
            datahead.id = data.head.id;
            datahead.recvsize = recvsize;
            datahead.size = filesize;
            int d = sendto(sockSc, (char*)(&datahead),
            sizeof(datahead),0,(sockaddr*)&server,lenth);
            id = id + 1;
        }

        else if( data.head.id < id)
        {
            datahead.id = data.head.id;
            datahead.recvsize=recvsize;
            datahead.size = filesize;
            int d = sendto(sockSc, (char*)(&datahead),
            sizeof(datahead), 0, (sockaddr*)&server, lenth);

         }
         if( filesize == recvsize )
         {
             datahead.id = data.head.id;
             datahead.recvsize =- 1;
             datahead.size = filesize;
             char sFile = filesize; 
             char rFile = recvsize;
             outtextxy(170, 200, "filesize = ");
             outtextxy(200, 200, sFile);
             outtextxy(170, 210, "recvsize = ");
             outtextxy(200, 210, rFile);
             outtextxy(200, 220, "文件已经收到了!\n");
             int d = sendto(sockSc, (char*)(&datahead),
             sizeof(datahead), 0, (sockaddr*)&server, lenth);
             recvexi = 2;
             break;
         }
    }
}
fclose(p);
recvexi = 2;
_tsystem(TEXT("pause"));

return 0;

}

3个回答

oyljerry
oyljerry   Ds   Rxr 2015.07.12 13:44

界面一般是在UI主线程。你接受代码不知道会不会影响。你可以多加点日志,起码看服务器有没有收到客户端发送的事件,还是客户端根本没发送过来

qq_27598289
qq_27598289   2015.07.12 14:02

客户端是发过来了的,做了测试,就是用没加界面的服务端 是可以接收到的,在没有启动符号连接器的时候,在堆栈里面显示的是你的框架不正确或者丢失,
启动符号连接器之后,堆栈显示没问题,但还是传不过去。

qq_27598289
qq_27598289   2015.07.12 14:04

而且在调用文件传输的时候,进入file函数后,就只掉用了一个ege的输入框,其他就没啥了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
EGE图形库,面向C/C++语言新手的图形库
 EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在。它的使用方法与TC中的graphics.h相当接近,对新手来说,简单,友好,容易上手,免费开源,而且因为接口意义直观,即使是之前完全没有接触过图形编程的,也能迅速学会基本的绘图。 目前,EGE图形库已经完美支持VC6, VC2008, VC2010, C-Free, DevCpp, Code::Blocks, wxDev, Eclipse for C/C++等IDE,即支持使用MinGW为编译环境的IDE。如果你需要在VC下使用graphics.h,那么ege将会是很好的替代品。
JS小游戏 - 宇宙战机
业余时间用javascript写的一个飞行射击游戏,纵向,一共六关。 游戏需求: 1.战机可发射子弹,子弹可通过获取道具升级。 2.战机可放bomb,可获取道具增加数量。 3.战机可蓄力攻击。 4.道具有三种,分别是升级子弹,增加bomb数量,增加战机数量。 5.每关音乐不同。 6.战机被击落后再进入战场,有保护状态。 7.敌机AI设计。
新手,求大神决绝问题
用css怎么写出  左边的一段,一段竖线!!!!
基于UDP协议文件传输系统的项目要求书 (C语言实训)
基于UDP协议文件传输系统的项目要求书, 大一下学期实训,这个是项目要求书的全文
基于MFC ppi计算器
新手自己写的ppi计算器,开发环境:vs2010 win8.1 ,求指导,求大神指导
易语言钓鱼源码
求大神买走 求大神买走 易语言钓鱼源码
Go 语言从新手到大神:每个人都会踩的五十个坑 (1-12)
本文翻译自最近各种 Go 语言社区分享的很多的英文文档 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs,小编第一眼以为 50 Shades of Grey…… Go语言是一个简单却蕴含深意的语言。但是,即便号称是最简单的C语言,都能总结出一本《C陷阱与缺陷》,更何况Go语言呢。Go语言中的许
发现目标检测的大神RBG做的工作,在我们学校可能博士都毕业不了
大神文章的引用率爆表啊,可是基本都是会议,我们学校都不够博士毕业要求的。
从基础小白到业内大神,ps高手的成长之路
他是《ps高手炼成记》丛书作者 网易金云奖获得者 领跑设计创办人 学员60万 …… 他是顾领中 你的最后一个设计老师     现在的顾领中老师,学员累计高达60万,但是一开始让他走上设计之路,纯属是当初填错大学志愿。 成为了设计系新生的顾领中,身在曹营心在汉,心中仍然满是金融、银行、公务员。 但是命运既然选中
[网络编程]TCP协议和UDP协议的区别
TCP协议与UDP协议的区别     首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。 TCP/IP协议集包括应用层,