我的程序在开始监听后在执行,在WSAWaitForMultipleEvents等待时,我用一个客户端对其进行请求,但是一点反应也没有,这是为什么?还是我在监听的代码就设置错了?
我的监听线程函数如下:
UINT _cdecl ListenThread(LPVOID pParam)
{
SOCKET myListenSocket;
sockaddr_in sockaddr;
int nResult;
WSAEVENT hListenEvent;
HWND hWnd;
WSAEVENT lphEvent[1]; hWnd = (HWND)pParam;
ASSERT ( hWnd != NULL ); sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(5000); myListenSocket = socket(AF_INET, SOCK_STREAM, 0);
ASSERT( myListenSocket != INVALID_SOCKET );
nResult = bind(myListenSocket, (LPSOCKADDR)&sockaddr, sizeof(sockaddr) );
ASSERT( nResult != SOCKET_ERROR);
hListenEvent = WSACreateEvent();
ASSERT( hListenEvent != NULL ); nResult = WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE);
ASSERT ( nResult == 0 ); lphEvent[0] = hListenEvent;
for(;;)
{
WSAWaitForMultipleEvents(1, lphEvent, true, INFINITE, true);
AfxMessageBox(" received ");
//...以下代码略 } return EXIT_SUCCESS;
}
我创建该监听线程的代码如下:
HANDLE hWnd;
hWnd = GetSafeHwnd();
AfxBeginThread(ListenThread, hWnd, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
我的监听线程函数如下:
UINT _cdecl ListenThread(LPVOID pParam)
{
SOCKET myListenSocket;
sockaddr_in sockaddr;
int nResult;
WSAEVENT hListenEvent;
HWND hWnd;
WSAEVENT lphEvent[1]; hWnd = (HWND)pParam;
ASSERT ( hWnd != NULL ); sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(5000); myListenSocket = socket(AF_INET, SOCK_STREAM, 0);
ASSERT( myListenSocket != INVALID_SOCKET );
nResult = bind(myListenSocket, (LPSOCKADDR)&sockaddr, sizeof(sockaddr) );
ASSERT( nResult != SOCKET_ERROR);
hListenEvent = WSACreateEvent();
ASSERT( hListenEvent != NULL ); nResult = WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE);
ASSERT ( nResult == 0 ); lphEvent[0] = hListenEvent;
for(;;)
{
WSAWaitForMultipleEvents(1, lphEvent, true, INFINITE, true);
AfxMessageBox(" received ");
//...以下代码略 } return EXIT_SUCCESS;
}
我创建该监听线程的代码如下:
HANDLE hWnd;
hWnd = GetSafeHwnd();
AfxBeginThread(ListenThread, hWnd, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
我在这个问题上已经困惑好几天了
你的socket好像没有accept;//我想问题可能出在这里
而且你用它干什么的?
nResult = WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE);
我是这么想的:
用WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE),当有请求到达时就可以使hListenEvent处于激发状态,然后我就可以对请求进行Accept()了。
你的意思是不是我只要在循环中进行Accept()就可以了,那如果没有请求到达的话,我怎么Accept()呢?
怎么你的listen跑哪里去了?
这个都没有,你怎么监听啊.bind后要记得listen然后才行,你程序流程没什么问题.
-》 shesh(无所谓):
你在上面说:你这样做也行,但没什么必要啊.为什么这么说呢?我刚学网络编程,请高手指点
当有请求时,开线程处理不就行了。
accept是可以接收到你的客户端的请求的,你可以试一下。
我不循环不是线程接收完一个请求就退出了吗?为什么说for循环没有用呢?-> jincai78:
没有请求时怎么accept呢?
accept()是不是可以堵塞运行的,所以可以直接调用?