[英]Multithreading won't work as expected
我的程序有问题。 我希望它有两个线程,一个线程监听连接,另一个线程从中接收数据……不幸的是,它的行为很奇怪。 在代码的任何地方,它将忽略我的cout和cin用法,因此我什至无法调试它。 我可以要求有人对此有所说明吗? 先感谢您。
#include <windows.h>
#include <iostream.h>
#include <string.h>
#include <cstdlib>
int ConnectionNum, Port=4673;
WSADATA wsaData;
SOCKET Connections[256];
DWORD WINAPI ReceiveThread(LPVOID iValue)
{
//this is going to be receiving TCP/IP packets, as soon as the connection works
}
DWORD WINAPI ListenThread(LPVOID iValue) //this thread is supposed to listen for new connections and store them in an array
{
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
WSAStartup(MAKEWORD(2,2), &wsaData);
ListeningSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(Port);
ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(ListeningSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));
if(listen(ListeningSocket, 5)!=0)
{
cout << "Could not begin listening for connections.";
return 0;
}
ConnectionNum=0;
while(ConnectionNum<256)
{
Connections[ConnectionNum]=accept(ListeningSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen);
ConnectionNum++;
cout << "New connection.";
}
}
int main()
{
HANDLE hThread1,hThread2;
DWORD dwGenericThread;
char lszThreadParam[3];
hThread1=CreateThread(NULL, 0, ListenThread, &lszThreadParam, 0, &dwGenericThread);
if(hThread1==NULL)
{
DWORD dwError=GetLastError();
cout<<"SCM:Error in Creating thread"<<dwError<<endl ;
return 0;
}
hThread2=CreateThread(NULL, 0, ReceiveThread, &lszThreadParam, 0, &dwGenericThread);
if(hThread2==NULL)
{
DWORD dwError=GetLastError();
cout<<"SCM:Error in Creating thread"<<dwError<<endl ;
return 0;
}
system("pause"); //to keep the entire program from ending
}
我没有看到任何CIN调用这里。 至于对cout的调用,您可能必须刷新输出,因为它是在单独的线程中调用的。 您可以通过简单地调用std :: endl来实现 :
cout << "New connection." << std::endl;
您的cout
调用未显示的原因可能是因为您向链接器提供了错误的参数。 您要指定/SUBSYSTEM:CONSOLE
吗? (链接器属性的“系统”选项卡)。 如果不是,那么您不是在告诉操作系统为该程序创建控制台,您可能是在告诉它它是Windows程序,如果您的程序没有控制台,那么您将看不到程序cout
输出...
一旦您可以看到调试...
我假设您正在从某种客户端连接到测试程序? 在连接到程序之前,什么都不会发生,这将导致对Accept()的调用返回。
顺便说一下, system("pause");
这可能是实现所需目标的最糟糕的方法,但我想您只是这样做,因为您无法让cin
工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.