//C++中网络编成,主函数
//
#include <winsock.h>
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
...{
WSADATA wsaData;
hInst = hCurInst;

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ...{
MessageBox(NULL, "WSAStartup Error" , szAppName, MB_OK);
}
DialogBox(hCurInst, "MONITOR", NULL, (DLGPROC)MyServerProc);

if (WSACleanup() != 0) ...{
MessageBox(NULL, "WSACleanup Error", szAppName, MB_OK);
}
return 0;
}
结构体

typedef struct ConnectCtrl_t ...{
SOCKET Socket;
int Port;
int Exist_Flag;
void (* SendData)(ConnectCtrl_t * );
int (* Connect)(ConnectCtrl_t * );
void (* Close)(ConnectCtrl_t * );
} ConnectCtrl;
BOOL CALLBACK MyServerProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
...{ 
switch (msg) ...{
case WM_INITDIALOG:
/**//* 受信ポート指定*/
s = socket(AF_INET, SOCK_DGRAM, 0);
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑顶地址
nRtn = bind(s, (LPSOCKADDR)&saddr, (int)sizeof(saddr));
//将socket消息发送到hWnd窗口上,然后在那里
// 处理相应的FD_READ,FD_WRITE等等消息
//提供异步数据传送
nRtn = WSAAsyncSelect(s, hDlg, MY_MSG, FD_READ);
//出力的套接字生成
..................................................
case MY_MSG:
nEvent = WSAGETSELECTEVENT(lp);
switch (nEvent) ...{
case FD_READ:
clientlen = (int)sizeof(client);
//读本アプリ的套接字的消息
nRtn = recvfrom(s, szBuf, (int)sizeof(szBuf) - 1, 0, (SOCKADDR *)&client, &clientlen);
//对消息进行处理,然后发送
.................................................................................
}
case WM_DESTROY:
closesocket(pCtrl->Socket); 
}
连接SLAVE
int Connect2Slave(ConnectCtrl * pCtrl)
...{
char* szServer = SERVER_IP;
SOCKADDR_IN saddr;
HOSTENT *lpHost;
unsigned int addr;
u_short uport;

if ( (pCtrl->Exist_Flag == 0) || (pCtrl->Socket != INVALID_SOCKET) )...{
return 0;
}
pCtrl->Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (pCtrl->Socket == INVALID_SOCKET) ...{
return -1;
}
// 自分のアドレス設定
lpHost = gethostbyname(szServer);
if (lpHost == NULL) ...{
addr = inet_addr(szServer);
lpHost = gethostbyaddr((char *)&addr, 4, AF_INET);
}
uport = TCPUDP_PORT + pCtrl->Port ;
memset(&saddr, 0, sizeof(SOCKADDR_IN));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(uport);
saddr.sin_addr.s_addr = *((u_long *)lpHost->h_addr);
// コネクション
if (connect(pCtrl->Socket, (SOCKADDR *)&saddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) ...{
if (WSAGetLastError() != WSAEWOULDBLOCK) ...{
closesocket(pCtrl->Socket );
pCtrl->Socket = INVALID_SOCKET;
return -1;
} else ...{
closesocket(pCtrl->Socket );
pCtrl->Socket = INVALID_SOCKET;
return -1;
}
} else ...{
return 0;
}
}
发送数据
nRet = send(pCtrl->Socket, szSendBuf, size, 0);
客户端的接收

Private Sub wsckTCPServerOfButtons_ConnectionRequest()Sub wsckTCPServerOfButtons_ConnectionRequest(index As Integer, ByVal requestID As Long)
If wsckTCPServerOfButtons(index).State <> sckClosed Then
'ソケットの連続をチャックし、クローズではないなら、クローズしておく
wsckTCPServerOfButtons(index).Close
End If
wsckTCPServerOfButtons(index).Accept requestID
' Text1.Text = "hello"
End Sub

Private Sub wsckTCPServerOfButtons_DataArrival()Sub wsckTCPServerOfButtons_DataArrival(index As Integer, ByVal bytesTotal As Long)
Dim chHexData() As Byte '直接のHEXデータ受信用
'接收
wsckTCPServerOfButtons(index).getdata chHexData
'变换
'解析
End Sub
本文介绍了一个使用C++实现的简单网络应用程序。该程序利用Winsock库创建了服务器与客户端的连接,并实现了基本的数据发送与接收功能。文章通过具体代码展示了如何初始化Winsock,设置并监听端口,以及如何建立连接并进行数据交换。
1855

被折叠的 条评论
为什么被折叠?



