我的程序有问题。我希望它有两个线程,其中一个监听连接,另一个从它们接收数据......不幸的是,它的行为很奇怪。它将忽略我在代码中的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
}
答案 0 :(得分:1)
我在这里看不到任何 cin 电话。至于对 cout 的调用,您可能必须刷新输出,因为它是在单独的线程中调用的。您只需调用 std :: endl :
即可完成此操作cout << "New connection." << std::endl;
答案 1 :(得分:1)
您的cout
调用未显示的原因可能是因为您向链接器提供了错误的参数。你是在指定/SUBSYSTEM:CONSOLE
吗? (链接器属性的“系统”选项卡)。如果没有,那么你并没有告诉操作系统为程序创建一个控制台,你可能会告诉它它是一个Windows程序,如果你的程序没有控制台那么你就不会看到你的程序cout
输出......
一旦你看到你的调试......
我假设您从某种类型的客户端连接到您的测试程序?在连接到程序之前不会发生任何事情,这将导致调用Accept()返回。
顺便说一句,system("pause");
可能是实现你想要的最糟糕的方式,但我认为你只是这样做,因为你无法让cin
工作......