//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
发表于 @ 2007年08月20日 16:10:00|评论(loading...)|编辑