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客户端实例是一个优秀的学习资源,它结合了Socket通信和多线程技术,为开发者提供了一个实际操作的平台,有助于提升网络编程技能。通过深入研究这个实例,不仅可以掌握Socket编程的基本...
在这个"多线程 VC++ MFC SOCKET 编程源代码"项目中,开发者可能创建了一个能够同时处理多个网络连接的应用程序。利用多线程,每个连接可以被分配到一个独立的线程中处理,这样就不会因为一个连接的阻塞而影响其他...
本资源“vc++多线程 网络编程 tcp/ip”专注于使用Microsoft的Visual C++(简称vc++)进行多线程编程,并结合TCP/IP协议实现网络数据的发送与接收。这里我们将详细探讨相关知识点。 首先,TCP(Transmission Control...
通过以上步骤,我们可以构建一个功能完备的VC++多线程Socket文件传输系统。在实际项目中,还需要考虑如并发控制、内存管理和资源管理等高级话题,以确保程序的稳定性和高效性。而`cn700_vc863523445`这个文件名可能...
在本文中,我们将深入探讨由标题“VC++多线程/进程编程实例(2)(4个实例-附源代码)”所涵盖的VC++编程技术。这个资源提供了四个具体的实例,旨在帮助开发者理解如何在VC++环境中进行多线程和多进程编程,以及线程...
### VC++多线程与网络编程详解 #### Windows的多任务与多线程基础 Windows作为现代操作系统,其核心优势之一在于支持多任务处理。在Windows下,用户可以同时进行多个活动,如编辑文档、听音乐和浏览网页,这一切...
同时,多线程编程需要注意同步问题,例如使用互斥量(mutex)或事件(event)来防止线程间的资源竞争。 这个示例中的源代码包含了客户端和服务器端的实现,通过运行这些代码,你可以实际观察到多线程非阻塞模式下的...
总的来说,"VC++网络通信编程实用案例精选"可能会包含一系列这样的示例,涵盖了从基本的TCP连接到复杂的多线程服务器设计。通过学习这些案例,开发者可以更好地理解和掌握如何在VC++环境中利用Winsock进行网络通信...
实际开发中,可能还需要处理错误、重试、超时等复杂情况,以及进行多线程或多进程的同步控制,以保证程序的健壮性和高效性。在HTTP_Server这个示例中,可能会包含一个基于Socket的HTTP服务器实现,通过异步通信处理...
总结来说,VC++多线程TCP聊天室的实现涉及到了网络编程、多线程编程和GUI设计等多个方面。通过这样的项目实践,开发者不仅可以巩固TCP/IP协议和多线程编程的理解,还能提升在实际应用中的问题解决能力。
4. **多线程技术**:在网络编程中,多线程常常用于处理并发连接,提高服务效率。这部分可能会介绍如何在VC++中使用线程类来实现并发服务。 5. **错误处理**:网络编程中,错误处理是非常重要的一环。书中的实例可能...
多线程编程在现代网络应用中非常常见,用于提高程序的响应性和执行效率。书中的例子可能涉及到如何创建和管理多个线程,以及如何在这些线程间同步数据,以避免竞态条件和死锁等问题。 并发处理是另一个关键主题,...
- 多线程服务器:服务器同时处理多个客户端连接,每个连接在一个独立的线程中运行。 - UDP广播和多播:利用UDP的特性,将数据发送给一组或多组特定的主机。 - 安全通信:使用SSL/TLS加密数据,实现安全的网络通信。 ...
以上是关于"vc++ 串口通信 socket winapi"主题的概述,包括串口通信的基本原理、Socket编程的应用、WinAPI的使用,以及多线程在串口通信中的角色。通过学习这些知识点,开发者可以构建起自己的串口通信和Socket程序...
通过这些文件,你可以学习如何在VC++环境中构建一个简单的客户端-服务器应用,包括设置套接字选项、进行数据传输以及实现多线程以处理多个并发连接。 总的来说,VC++结合Win32 API的WinSocket编程提供了一种强大且...
接下来是"chap2",这一章可能深入讲解了更复杂的网络通信技术,如多线程编程在并发处理客户端请求中的应用,或者UDP(User Datagram Protocol)的无连接特性及其在广播和多播中的使用。多线程可以提高服务器的处理...
在本文中,我们将深入探讨如何在Visual C++ 6.0(简称VC6.0)环境下进行多线程编程,并结合Socket通信实现一个简单的客户端-服务器应用。标题提及的"vc6.0下实现 多线程编程的实例"正是我们要讨论的核心内容,而描述...
Socket通信包括服务器端和客户端两部分。服务器端需要创建一个监听Socket,等待客户端的连接请求。这可以通过调用`socket`函数创建Socket,`bind`函数绑定到特定的IP地址和端口,以及`listen`函数开始监听。一旦有...
4. **多线程编程**:在网络编程中,多线程技术常常用来处理并发连接,提高系统效率。VC++提供了丰富的多线程支持,包括创建线程、同步线程操作(如互斥量、信号量和事件对象)等。 5. **异步I/O**:为了解决阻塞I/O...