客戶端與服務端能夠連接成功,當其中一個關閉,另一個也會正常收到通知
我遇到的問題是:當客戶端發送一條訊息給服務端時,發送是成功的,服務端卻沒有任何反應,沒有觸發FD_READ,我就很疑惑,是不是我哪個步驟錯了,可是我看網上都是差不多這么寫的呀。請你們幫我看看是哪的問題,十分感謝!
代碼如下:
服務端:
// Service.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <winsock2.h>
#include "resource.h"
#include <IOSTREAM.H>
#define WM_SOCKET WM_USER + 1
BOOL CALLBACK DialogService(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
SOCKET g_Client;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HWND Window = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_SERVICE), NULL, DialogService);
WSADATA wd;
WSAStartup(0x0202, &wd);
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int error = 0;
if (SOCKET_ERROR == sListen)
{
error = WSAGetLastError();
return -1;
}
SOCKADDR_IN sock_in;
sock_in.sin_family = AF_INET;
sock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sock_in.sin_port = htons(5050);
if (SOCKET_ERROR == bind(sListen, (SOCKADDR *)&sock_in, sizeof(sock_in)))
{
error = WSAGetLastError();
return -1;
}
if (SOCKET_ERROR == listen(sListen, 3))
{
error = WSAGetLastError();
return -1;
}
if (SOCKET_ERROR == WSAAsyncSelect(sListen, Window, WM_SOCKET, FD_ACCEPT |FD_CLOSE))
{
error = WSAGetLastError();
return -1;
}
SendDlgItemMessage(Window, IDC_LIST1, LB_ADDSTRING, 0, LPARAM("start Listen..."));
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
BOOL CALLBACK DialogService(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_SOCKET:
{
if (WSAGETASYNCERROR(lParam))
{
closesocket(wParam);
SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM("與客戶連接中斷!"));
break;
}
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
{
g_Client = accept(wParam, NULL, NULL);
if (SOCKET_ERROR == g_Client)
{
break;
}
if (SOCKET_ERROR == WSAAsyncSelect(wParam, hwndDlg, WM_SOCKET, FD_READ| FD_WRITE |FD_CLOSE))
{
break;
}
SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM("accept success ! "));
}
break;
case FD_READ:
{
char szBuf[30] = "";
if (SOCKET_ERROR == recv(wParam, szBuf, 30, 0))
{
SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM(szBuf));
InvalidateRect(GetDlgItem(hwndDlg, IDC_LIST1), NULL, TRUE);
break;
}
}
break;
case FD_WRITE:
{
char szBuf[30] = "";
GetWindowText(GetDlgItem(hwndDlg, IDC_INPUT), szBuf, 30);
SetWindowText(GetDlgItem(hwndDlg, IDC_INPUT), "");
int result = send(wParam, szBuf, strlen(szBuf) + 1, 0);
if (SOCKET_ERROR == result)
{
closesocket(wParam);
return -1;
}
//SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM(szBuf));
}
break;
case FD_CLOSE:
{
closesocket(wParam);
break;
}
break;
}
}
break;
case WM_COMMAND:
{
if (BN_CLICKED == HIWORD(wParam))
{
if (LOWORD(wParam) == IDC_SEND)
{
SendMessage(hwndDlg, WM_SOCKET, g_Client, FD_WRITE);
}
}
}
break;
case WM_CLOSE:
DestroyWindow(hwndDlg);
break;
case WM_DESTROY:
PostQuitMessage(NULL);
break;
default:
return FALSE;
}
return TRUE;
}
客戶端:
// Client.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <winsock2.h>
#include "resource.h"
#include <IOSTREAM.H>
#include <windows.h>
#define WM_SOCKET WM_USER + 1
BOOL CALLBACK DialogClient(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
SOCKET g_Client;
SOCKADDR_IN g_sock_in;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HWND Window;
Window = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogClient);
WSADATA wd;
WSAStartup(0x0202, &wd);
g_Client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int error = 0;
if (SOCKET_ERROR == g_Client)
{
error = WSAGetLastError();
return -1;
}
g_sock_in.sin_family = AF_INET;
g_sock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
g_sock_in.sin_port = htons(5050);
if(SOCKET_ERROR == connect(g_Client, (SOCKADDR *)&g_sock_in, sizeof(g_sock_in)))
{
error = WSAGetLastError();
return -1;
}
SendDlgItemMessage(Window, IDC_LIST1, LB_ADDSTRING, 0, LPARAM("與服務連接成功!"));
if (SOCKET_ERROR == WSAAsyncSelect(g_Client, Window, WM_SOCKET, FD_CONNECT | FD_CLOSE))
{
error = WSAGetLastError();
return -1;
}
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
BOOL CALLBACK DialogClient(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_SOCKET:
{
if (WSAGETASYNCERROR(lParam))
{
closesocket(wParam);
SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM("與服務連接中斷!"));
break;
}
switch (WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
{
SOCKET sConnect = connect(wParam, (SOCKADDR *)&g_sock_in, sizeof(g_sock_in));
SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM("與服務連接成功!"));
if(SOCKET_ERROR == sConnect)
{
break;
}
if(SOCKET_ERROR == WSAAsyncSelect(sConnect, hwndDlg, WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE))
{
break;
}
SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM("connect success!"));
}
break;
case FD_WRITE:
{
char szBuf[30] = "";
GetWindowText(GetDlgItem(hwndDlg, IDC_INPUT), szBuf, 30);
SetWindowText(GetDlgItem(hwndDlg, IDC_INPUT), "");
int result = send(wParam, szBuf, strlen(szBuf) + 1, 0);
if (SOCKET_ERROR == result)
{
closesocket(wParam);
return -1;
}
//SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM(szBuf));
}
break;
case FD_READ:
{
char szBuf[30] = "";
if (SOCKET_ERROR == recv(wParam, szBuf, 30, 0))
{
SendDlgItemMessage(hwndDlg, IDC_LIST1, LB_ADDSTRING, 0, LPARAM(szBuf));
InvalidateRect(GetDlgItem(hwndDlg, IDC_LIST1), NULL, TRUE);
break;
}
}
break;
case FD_CLOSE:
{
closesocket(wParam);
break;
}
break;
}
}
break;
case WM_COMMAND:
{
if (BN_CLICKED == HIWORD(wParam))
{
if (LOWORD(wParam) == IDC_SEND)
{
SendMessage(hwndDlg, WM_SOCKET, g_Client, FD_WRITE);
}
}
}
break;
case WM_CLOSE:
DestroyWindow(hwndDlg);
break;
case WM_DESTROY:
PostQuitMessage(NULL);
break;
default:
return FALSE;
}
return TRUE;
}
uj5u.com熱心網友回復:

accept的客戶端socket,要用這個
WSAAsyncSelect(g_client, hwndDlg, xxxx
你還是用的wparam還是服務器listen的socket
g_Client = accept(wParam, NULL, NULL);
if (SOCKET_ERROR == g_Client)
{
break;
}
if (SOCKET_ERROR == WSAAsyncSelect(g_Client ,
uj5u.com熱心網友回復:
嗯嗯,聽了你的意見,問題解決了
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/10470.html
標籤:網絡編程
上一篇:mfc資料庫
