【发布时间】:2014-03-07 01:40:05
【问题描述】:
我目前正在做我的高级项目,该项目几乎完成了,但是我需要在不支持 C++11 的 VisualStudio 2010 中实现多线程。因此,我将其用作多线程的源(由我的讲师建议)http://msdn.microsoft.com/en-us/library/windows/desktop/ms682516(v=vs.85).aspx,我完全不知道如何使用 SOCKET 实现它。
我的问题是如何将我已经编码的套接字与多线程一起使用。以下是我到目前为止所拥有的。
typedef struct SenderData {
SOCKET socConnection;
} SENDERDATA, *PSENDERDATA;
DWORD WINAPI SenderThreadFunction( LPVOID lpParam){
HANDLE hStdout;
PSENDERDATA pDataArray;
TCHAR msgBuf[BUF_SIZE];
size_t cchStringSize;
DWORD dwChars;
// Make sure there is a console to receive output results.
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if( hStdout == INVALID_HANDLE_VALUE )
return 1;
// Cast the parameter to the correct data type.
// The pointer is known to be valid because
// it was checked for NULL before the thread was created.
pDataArray = (PSENDERDATA)lpParam;
return 0;
}
此函数具有在 telnet 中启动会话并从文件发送消息的所有命令
DWORD WINAPI Sender(LPVOID lpParam){
}
以下创建连接,我最初在 main() 中创建了该连接,但现在不确定将其放置在哪里
WSADATA wsaData; // Creates wsaData object
WSAStartup(MAKEWORD(2, 2), &wsaData); //Initializes Winsock
//Creates the socket object named "soc(Connection"
SOCKET socConnection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN Addr;
HOSTENT* Host = gethostbyname("smtp.com");
Addr.sin_addr.s_addr = inet_addr(inet_ntoa(*(in_addr*)Host->h_addr_list[0]));
Addr.sin_family = AF_INET;
Addr.sin_port = htons(25);
如果我不使用线程,这将在 main() 中调用
if (connect(Connection, (SOCKADDR*)&Addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
cout << "Connection Failed" << endl;
在 main() 中执行以下代码时,我将如何放置前面的代码来启动? 我是 C++ 的新手,非常感谢任何帮助。提前谢谢你。
hThreadArray[0] = CreateThread(
NULL, // default security attributes
0, // use default stack size
Sender, // thread function name
pDataArray[0], // argument to thread function
0, // use default creation flags
&dwThreadIdArray[0]); // returns the thread identifier
【问题讨论】:
-
您遇到的实际问题是什么?
-
@RemyLebeau 我不知道如何在 Sender 线程中调用连接函数,同时也已经创建了连接。基本上有没有办法调用Sender函数,它会创建连接并发送数据?
-
在我看来,C++11 根本不会让你的任务变得更容易,而且 VS2010 也有一些 C++11 的特性。您的问题与多线程相关,学习多线程不是几个小时或几天的课程,尤其是在 C/C++ 中。您链接的示例也是 C 示例而不是 C++ 示例。正确的 C++ 实现会将线程封装到一个线程类中,这会使事情变得更容易。
标签: c++ multithreading sockets