Chinaunix首页 | 论坛 | 博客
  • 博客访问: 661841
  • 博文数量: 175
  • 博客积分: 2457
  • 博客等级: 大尉
  • 技术积分: 1488
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-13 20:31
文章分类

全部博文(175)

文章存档

2012年(22)

2011年(153)

分类: C/C++

2011-07-27 20:42:27


Cpp代码  收藏代码
  1. #include "StdAfx.h"  
  2. #include   
  3. //服务器端程序  
  4. DWORD WINAPI AnswerThread(LPVOID lparam)  
  5. {  
  6.            SOCKET ClientSocket=(SOCKET)(LPVOID)lparam;  
  7.            char szText[]="您好!\r\n";  
  8.           int send_num=::send(ClientSocket,szText,strlen(szText),0);  
  9.          ::closesocket(ClientSocket);  
  10.       return 0;  
  11.           
  12. }  
  13.   
  14. int main()  
  15. {  
  16.            WSADATA wsaData;  
  17.            int iRet=WSAStartup(MAKEWORD(1,1),&wsaData);   
  18.            SOCKET m_socket;  
  19.            m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
  20.            if(m_socket==INVALID_SOCKET)  
  21.            {  
  22.                        WSACleanup();  
  23.                        return 0;  
  24.            }  
  25.            sockaddr_in service;  
  26.            service.sin_family=AF_INET;  
  27.            service.sin_addr.s_addr=inet_addr("172.16.3.250");  
  28.            service.sin_port=htons(2501);  
  29.   
  30.            if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)  
  31.            {  
  32.                        closesocket(m_socket);  
  33.                        return 0;  
  34.            }  
  35.            else  
  36.                        printf("bind OK.\n");  
  37.            if(listen(m_socket,20)==SOCKET_ERROR)  
  38.                        printf("Error listening on socket.\n");  
  39.            else  
  40.                        printf("listening ok.\n");  
  41.            SOCKET AcceptSocket;              
  42.            printf("Waiting for a client to connect...\n");  
  43.            while(1)  
  44.            {  
  45.                        AcceptSocket=SOCKET_ERROR;  
  46.                        while(AcceptSocket==SOCKET_ERROR)  
  47.                        {  
  48.                                    AcceptSocket=accept(m_socket,NULL,NULL);  
  49.                        }                       
  50.                        printf("Client Connected.\n");                          
  51.                        DWORD dwThreadId;  
  52.                        HANDLE hThread;  
  53.                           
  54.                        hThread=CreateThread(NULL,NULL,AnswerThread,  
  55.                                        (LPVOID)AcceptSocket,0,&dwThreadId);  
  56.                        closehandle(hThread);  
  57.                       //Sleep(4000);  
  58.                        closesocket(AcceptSocket);  
  59.           }  
  60.           closesocket(m_socket);             
  61.            return 0;  
  62. }  
 


该服务器端程序为什么如果有注释掉的Sleep(4000)客户端就接收返回正确的数据,注释掉后就接受到0个字符?? 
    提问者: wiggle_waggle - 实习生 一级 最佳答案你给客户端发送数据是用send么 
如果没Sleep的话,你创建了一个新线程,创建新线程的同时,当前线程也在运行,socket都被你关掉了,还怎么send?? 
线程跟函数是不同的,函数是等调用结束后才执行下一个语句 
int send_num=::send(ClientSocket,szText,strlen(szText),0); 应该要修改为:int send_num=::send(ClientSocket,szText,strlen(szText)+1,0); 
不过,这与你的问题无关。 
转自:


在VC++ 的 MFC中 函数经过多线程编程后不能运行?? 
悬赏分:20 - 解决时间:2009-3-2 19:52 
本来一个函数为 
void function() 

  CvCapture* capture = 0;  
  capture = cvCaptureFromCAM(0); 
  if( !capture ) 
  { 
   //fprintf(stderr,"Could not initialize capturing...\n"); 
   AfxMessageBox("Could not initialize capturing..."); 
  }  
  for(;;) 
  { 
   IplImage* frame = 0;   
   frame = cvQueryFrame( capture ); 
   if( !frame ) 
    break;   
   CDC *pDC = GetDlgItem(IDC_STATIC)->GetDC(); 
   CvvImage cimg; 
   HDC hDC= pDC->GetSafeHdc(); 
   CRect rect; 
   GetDlgItem(IDC_STATIC)->GetClientRect(&rect);   
   cimg.CopyOf(frame); //gFrame是那帧图像 
   cimg.DrawToHDC(hDC,&rect);   
   ReleaseDC(pDC); 
  } 
  
cvReleaseCapture( &capture ); 

是没有问题的。多线程编程中由于要把函数定义成全局型的所以就变成: 
DWORD WINAPI LoadVideo(LPVOID pParam) 

  CVideoDlg dlg; 
  CvCapture* capture = 0;  
  capture = cvCaptureFromCAM(0);  
  if( !capture ) 
  { 
   //fprintf(stderr,"Could not initialize capturing...\n"); 
   AfxMessageBox("Could not initialize capturing..."); 
  }  
  for(;;) 
  { 
   IplImage* frame = 0;   
   frame = cvQueryFrame( capture ); 
   if( !frame ) 
    break;    
   CDC *pDC = dlg.GetDlgItem(IDC_STATIC)->GetDC(); 
   CvvImage cimg; 
   HDC hDC= pDC->GetSafeHdc(); 
   CRect rect; 
   dlg.GetDlgItem(IDC_STATIC)->GetClientRect(&rect);   
   cimg.CopyOf(frame); //gFrame是那帧图像 
   cimg.DrawToHDC(hDC,&rect);   
   dlg.ReleaseDC(pDC); 
  } 
cvReleaseCapture( &capture ); 
return 1; 

然后再用CreateThread函数调用。编译没问题。但是 运行后就弹出了程序出错对话框。如图所示。请问是什么原因呢? 
      最佳答案把这个全局函数的功能全写回到你的成员函数里,然后你调用线程时将当前的this指针传进去,再在这个全局函数调用你的成员函数(通过传入的this指针调用,记得将参数强制转换回你原来的类型)

阅读(3181) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~