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++ 多线程 网络编程 关于tcp ip协议 的。实现数据的发送接收,关于socket的使用。
VC++使用Socket2网络编程(绝版好书10本) IPv6 Network Programming.pdf Network_Programming_for_Microsoft_Windows_-2 Programming Winsock-Arthur Dumas.pdf TCPIP sockets in C-Practical Guide for Progr ...
1.套接字编程原理 1.1 Client/server 通信模型 1.2 Windows Sockets 规范 1.3 套接字 1.3.1 套接字定义 1.3.2 分类 1.3.3 套接字的作用 1.3.4 端口与地址 ...5. 怎样实现服务器端多线程的socket 功能?
在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
单机资源共享的应用编程2.1 进程间通信2.1.1 进程间通信应用实例及概念2.1.2 进程的创建与终止2.1.3 内存文件映射2.2 多线程通信2.2.1 多线程应用实例及概念2.2.2 线程的创建、挂起、激活和终止2.2.3 线程的优先级...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
单机资源共享的应用编程2.1 进程间通信2.1.1 进程间通信应用实例及概念2.1.2 进程的创建与终止2.1.3 内存文件映射2.2 多线程通信2.2.1 多线程应用实例及概念2.2.2 线程的创建、挂起、激活和终止2.2.3 线程的优先级...