COnlyServerDlg::COnlyServerDlg

本文介绍了一个名为COnlyServerDlg类的初始化过程及OnOK与OnCancel等事件处理函数的具体实现细节。该类涉及了Windows Socket API的使用,包括WSAStartup初始化、套接字创建与绑定、监听模式设置以及数据读取等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

COnlyServerDlg::COnlyServerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(COnlyServerDlg::IDD, pParent),iTCP(1),iUDP(2)
{
	//{{AFX_DATA_INIT(COnlyServerDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	//
	run_cancelled = 0; /* 指示何时按下了取消按钮 */
	running = FALSE; /* 程序的运行状态 */
	iProto = 1; /* 缺省为 TCP Shout */
	iPortNo = SOCK_SHOUT;
	blocking_option = 0L; /* 阻塞模式的全局标识 */
	len = 1024;
}
/////////////////////////////////
	// TODO: Add extra initialization here
	WORD wMajorVersion, wMinorVersion;
	wMajorVersion = MAJOR_VERSION;
	wMinorVersion = MINOR_VERSION;
	WORD VersionReqd;
	VersionReqd=WSA_MAKEWORD(wMajorVersion, wMinorVersion);
	WSADATA wsadata;
	int ret;
	ret = WSAStartup(VersionReqd, &wsadata);
	if (ret != 0){
	wshout_err ( WSAGetLastError(), "WSAStartup()");
	}	
	return TRUE;  // return TRUE  unless you set the focus to a control
//////////////////////////////////
void COnlyServerDlg::OnOK() 
{
	// TODO: Add extra validation here

	long lret;
run_cancelled = FALSE;
/* 不能重入 */
if (running)
{
	MessageBox("Shout is already running !",
	"Shout", MB_OK | MB_APPLMODAL | MB_ICONEXCLAMATION);
	return ;
}
ClearBoxes();
running = TRUE;
//作为服务器
	sd = GetSocketAndBind( iPortNo);
	if (sd == SOCKET_ERROR) {
	running = FALSE;
	return ;
	}
/* Set the I/O mode of the socket */
if (blocking_option) {
lret = 1L; /* 非阻塞模式 */
ioctlsocket(sd, FIONBIO, (u_long FAR *) &lret);
}
else {
lret = 0L; /* 阻塞模式 */
ioctlsocket(sd, FIONBIO, (u_long FAR *) &lret);
}

/* LISTEN */
//作为服务器
if (iProto == iTCP)
lret = TReadData(sd, len);
else /* UDP */
lret = UReadData(sd, len);

closesocket(sd);
running = FALSE;//. 43 .
return ;
//CDialog::OnOK();
}
/////////////////////////////////
void COnlyServerDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	if (running) {
	/* 停止 */
int	ret = WSACancelBlockingCall();
	run_cancelled = TRUE;
	if (ret == SOCKET_ERROR) {
	/* WSANOTINITIALISED or WSAENETDOWN or WSAEINVAL */
	if (h_errno == WSAENETDOWN) {
	/* Watch out for hAcceptSock! */
	/* close what is left of the connection */
	closesocket(sd);
	}
	}
	}
	return;	
	//CDialog::OnCancel();
}
///////////////////////////////
void COnlyServerDlg::OnExit() 
{
int ret = WSACleanup();
if (ret == SOCKET_ERROR && h_errno == WSAEINPROGRESS){
MessageBox(
"Data transfer in progress.\nStop transfer first.",
"WndProc()", MB_OK | MB_APPLMODAL|MB_ICONINFORMATION);
return; /* 一个套接口正处于阻塞状态 */
}
//_free((char NEAR *) lpmyWSAData);
EndDialog(TRUE) ; /* 退出 */	
}
////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值