`
gstarwd
  • 浏览: 1525149 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

vc++ 多线程编程 SOCKET通信

    博客分类:
  • VC++
阅读更多

   vc++ 多线程编程 SOCKET通信

#include "StdAfx.h"
#include <stdio.h>
//服务器端程序
DWORD WINAPI AnswerThread(LPVOID lparam)
{
           SOCKET ClientSocket=(SOCKET)(LPVOID)lparam;
           char szText[]="您好!\r\n";
          int send_num=::send(ClientSocket,szText,strlen(szText),0);
         ::closesocket(ClientSocket);
      return 0;
        
}

int main()
{
           WSADATA wsaData;
           int iRet=WSAStartup(MAKEWORD(1,1),&wsaData); 
           SOCKET m_socket;
           m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
           if(m_socket==INVALID_SOCKET)
           {
                       WSACleanup();
                       return 0;
           }
           sockaddr_in service;
           service.sin_family=AF_INET;
           service.sin_addr.s_addr=inet_addr("172.16.3.250");
           service.sin_port=htons(2501);

           if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
           {
                       closesocket(m_socket);
                       return 0;
           }
           else
                       printf("bind OK.\n");
           if(listen(m_socket,20)==SOCKET_ERROR)
                       printf("Error listening on socket.\n");
           else
                       printf("listening ok.\n");
           SOCKET AcceptSocket;            
           printf("Waiting for a client to connect...\n");
           while(1)
           {
                       AcceptSocket=SOCKET_ERROR;
                       while(AcceptSocket==SOCKET_ERROR)
                       {
                                   AcceptSocket=accept(m_socket,NULL,NULL);
                       }                     
                       printf("Client Connected.\n");                        
                       DWORD dwThreadId;
                       HANDLE hThread;
                        
                       hThread=CreateThread(NULL,NULL,AnswerThread,
                                       (LPVOID)AcceptSocket,0,&dwThreadId);
                       closehandle(hThread);
                      //Sleep(4000);
                       closesocket(AcceptSocket);
          }
          closesocket(m_socket);           
           return 0;
}
 


该服务器端程序为什么如果有注释掉的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);
不过,这与你的问题无关。
转自:http://zhidao.baidu.com/question/110558487.htmlfr=qrl&cid=866&index=3&fr2=query


在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指针调用,记得将参数强制转换回你原来的类型)

分享到:
评论

相关推荐

    vc++ 多线程socket客户端

    综上所述,VC++多线程Socket客户端实例是一个优秀的学习资源,它结合了Socket通信和多线程技术,为开发者提供了一个实际操作的平台,有助于提升网络编程技能。通过深入研究这个实例,不仅可以掌握Socket编程的基本...

    多线程 VC++ MFC SOCKET 编程源代码

    在这个"多线程 VC++ MFC SOCKET 编程源代码"项目中,开发者可能创建了一个能够同时处理多个网络连接的应用程序。利用多线程,每个连接可以被分配到一个独立的线程中处理,这样就不会因为一个连接的阻塞而影响其他...

    vc++多线程 网络编程 tcp/ip

    本资源“vc++多线程 网络编程 tcp/ip”专注于使用Microsoft的Visual C++(简称vc++)进行多线程编程,并结合TCP/IP协议实现网络数据的发送与接收。这里我们将详细探讨相关知识点。 首先,TCP(Transmission Control...

    VC++ 多线程socket文件传输

    通过以上步骤,我们可以构建一个功能完备的VC++多线程Socket文件传输系统。在实际项目中,还需要考虑如并发控制、内存管理和资源管理等高级话题,以确保程序的稳定性和高效性。而`cn700_vc863523445`这个文件名可能...

    VC++多线程/进程编程实例(2)(4个实例-附源代码)

    在本文中,我们将深入探讨由标题“VC++多线程/进程编程实例(2)(4个实例-附源代码)”所涵盖的VC++编程技术。这个资源提供了四个具体的实例,旨在帮助开发者理解如何在VC++环境中进行多线程和多进程编程,以及线程...

    VC++多线程与网络

    ### VC++多线程与网络编程详解 #### Windows的多任务与多线程基础 Windows作为现代操作系统,其核心优势之一在于支持多任务处理。在Windows下,用户可以同时进行多个活动,如编辑文档、听音乐和浏览网页,这一切...

    socket 多线程 例程 非阻塞模式

    同时,多线程编程需要注意同步问题,例如使用互斥量(mutex)或事件(event)来防止线程间的资源竞争。 这个示例中的源代码包含了客户端和服务器端的实现,通过运行这些代码,你可以实际观察到多线程非阻塞模式下的...

    vc++网络通信编程实用案例精选

    总的来说,"VC++网络通信编程实用案例精选"可能会包含一系列这样的示例,涵盖了从基本的TCP连接到复杂的多线程服务器设计。通过学习这些案例,开发者可以更好地理解和掌握如何在VC++环境中利用Winsock进行网络通信...

    VC++异步通信的socket类

    实际开发中,可能还需要处理错误、重试、超时等复杂情况,以及进行多线程或多进程的同步控制,以保证程序的健壮性和高效性。在HTTP_Server这个示例中,可能会包含一个基于Socket的HTTP服务器实现,通过异步通信处理...

    VC++多线程 TCP 聊天室.

    总结来说,VC++多线程TCP聊天室的实现涉及到了网络编程、多线程编程和GUI设计等多个方面。通过这样的项目实践,开发者不仅可以巩固TCP/IP协议和多线程编程的理解,还能提升在实际应用中的问题解决能力。

    《VC++网络通信编程实例案例精选》光盘源代码

    4. **多线程技术**:在网络编程中,多线程常常用于处理并发连接,提高服务效率。这部分可能会介绍如何在VC++中使用线程类来实现并发服务。 5. **错误处理**:网络编程中,错误处理是非常重要的一环。书中的实例可能...

    《VC++网络通信编程实例案例精选》源代码 第二部分

    多线程编程在现代网络应用中非常常见,用于提高程序的响应性和执行效率。书中的例子可能涉及到如何创建和管理多个线程,以及如何在这些线程间同步数据,以避免竞态条件和死锁等问题。 并发处理是另一个关键主题,...

    VC++网络通信编程实例案例精选

    - 多线程服务器:服务器同时处理多个客户端连接,每个连接在一个独立的线程中运行。 - UDP广播和多播:利用UDP的特性,将数据发送给一组或多组特定的主机。 - 安全通信:使用SSL/TLS加密数据,实现安全的网络通信。 ...

    vc++ 串口通信 socket winapi

    以上是关于"vc++ 串口通信 socket winapi"主题的概述,包括串口通信的基本原理、Socket编程的应用、WinAPI的使用,以及多线程在串口通信中的角色。通过学习这些知识点,开发者可以构建起自己的串口通信和Socket程序...

    VC++SOcket 编程

    通过这些文件,你可以学习如何在VC++环境中构建一个简单的客户端-服务器应用,包括设置套接字选项、进行数据传输以及实现多线程以处理多个并发连接。 总的来说,VC++结合Win32 API的WinSocket编程提供了一种强大且...

    《VC++网络通信编程实例案例精选》源代码 第一部分

    接下来是"chap2",这一章可能深入讲解了更复杂的网络通信技术,如多线程编程在并发处理客户端请求中的应用,或者UDP(User Datagram Protocol)的无连接特性及其在广播和多播中的使用。多线程可以提高服务器的处理...

    vc6.0下实现 多线程编程的实例

    在本文中,我们将深入探讨如何在Visual C++ 6.0(简称VC6.0)环境下进行多线程编程,并结合Socket通信实现一个简单的客户端-服务器应用。标题提及的"vc6.0下实现 多线程编程的实例"正是我们要讨论的核心内容,而描述...

    VC++_socket网络通信基础

    Socket通信包括服务器端和客户端两部分。服务器端需要创建一个监听Socket,等待客户端的连接请求。这可以通过调用`socket`函数创建Socket,`bind`函数绑定到特定的IP地址和端口,以及`listen`函数开始监听。一旦有...

    VC++网络通信编程实例

    4. **多线程编程**:在网络编程中,多线程技术常常用来处理并发连接,提高系统效率。VC++提供了丰富的多线程支持,包括创建线程、同步线程操作(如互斥量、信号量和事件对象)等。 5. **异步I/O**:为了解决阻塞I/O...

Global site tag (gtag.js) - Google Analytics