Programs that use VC6.0 compilers to transfer messages with clients
---- Nanjing University of Science and Technology Zhu Xiaohua
---- Network programming has become a fashionable, more popular in TCP / IP protocols. Make a server with the client to transfer the message to each other in order to increase your own network programming. I will introduce me below. The program.
---- First introduce the server program:
---- 1. Create a project called "Server", single document interface.
---- 2. Add code in ServerView.h:
#include "winsock.h"
Add variables:
CSIZE SIZETAl; / / Control Scroll Bar
INTCOUNT; // information
CString M_Data [1000]; // Information storage
Char Hostname [260];
Char Hostaddress [20]; // host IP address
Socket m_sock;
Handle m_hlistenthread; // thread
BOOL M_BINITIALIZED; / / Whether is initialized
WSADATAWSADATA;
Bool flag;
SockAddr_in saclnt;
INT SACLNTLEN;
Bool isconnect; // is connected
---- 3. Overload the CSerView () constructor in ServerView.cpp, create and bind the nested word:
CSERVERVIEW :: CSERVERVIEW ()
{
// Todo: Add Construction Code Here
ISCONNECT = FALSE;
Flag = false;
Sizetotal.cy = 350;
Sizetotal.cx = 300;
m_hlistenthread;
Count = 5;
Int status;
Wsadata wsadata;
m_data [0] = "Initializing Windows Sockets DLL ...."
IF ((status = wsastartup (0x0101, & wsadata)) == 0)
{
m_data [0] = "succeeded";
m_binitialized = true;
}
Else
{
m_binitialized = false;
}
M_Sock = Socket (AF_INET, SOCK_DGRAM, 0);
M_data [1] = "CREATING Socket ....";
IF (m_sock == invalid_socket)
{
m_data [1] = "failed";
}
m_data [1] = "succeeded";
M_Data [2] = "Binding Socket ....";
SockAddr_in SA;
sa.sin_family = af_inet;
Sa.sin_addr.s_un.s_addr = HTONL (INADDR_ANY);
sa.sin_port = HTONS (5050);
IF (Bind (M_SockAddr) & Sa, Sizeof
(sa)) == Socket_ERROR)
{
m_data [2] = "failed";
CloseSocket (M_SOCK);
}
m_data [2] = "succeeded";
M_data [3] = "CREATING LISTENER THREAD ....";
Unsigned long idthread;
m_hlistenthread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) LISTEN, (void *)
This, 0, & idthread;
IF (m_hlistenthread)
{m_data [3] = "succeeded";
m_data [4] = "listening ....";
}
Else
m_data [4] = "failed";
}
---- 4. Complete the required clearing operation in the destructor:
CSERVERVIEW :: ~ CSERVERVIEW ()
{
IF (m_binitialize)
WSACLEANUP ();
CloseSocket (M_SOCK);
IF (m_hlistenthread)
:: TerminateThread (M_HlistentHread, 0);
}
---- 5. Define threads that receive and process messages:
Long WinAPI Listen (CServerView * PVIEW)
{
Char msg [2000] = ""
INTNCHAR;
SockAddr_in saclnt;
INT SACLNTLEN;
While (1)
{
Saclntlen = SizeOf (SACLNT);
nchar = recvfrom (pview-> m_sock, msg, 1024, 0,
(PSOCKADDR) & SACLNT, & SACLNTLEN;
IF (nchar <0) {pView-> m_data [pView-> count ]
= "Error in Recvfrom / N";
PView-> InvalidateERECT (NULL);
}
Else
{
Switch (msg [0])
{
Case'A ':
WSPrintf (MSG, "A: Client from% s
Attached / n ", INET_NTOA (SACLNT.SIN_ADDR);
PView-> m_data [pView-> count ] = msg;
PView-> flag = true;
PView-> InvalidateERECT (NULL);
PVIEW-> isconnect = TRUE;
PVIEW-> SACLNT = SACLNT;
PView-> Saclntlen = SACLNTLEN;
Sendto (PView-> M_Sock, MSG, 1024, 0,
(PSOCKADDR) & SACLNT, SACLNTLEN;
Break;
Case 'd':
WSPRINTF (MSG, "D: Client Form% s
Detached / N ", INET_NTOA (SACLNT.SIN_ADDR);
PView-> m_data [pView-> count ] = msg;
PView-> flag = true;
PView-> InvalidateERECT (NULL);
PVIEW-> isconnect = false;
Sendto (PView-> M_Sock, MSG, 1024, 0,
(PSOCKADDR) & SACLNT, SACLNTLEN;
Break;
Case 'R':
Saclntlen = SizeOf (SACLNT);
PView-> m_data [pView-> count ] = msg;
PView-> flag = true;
PView-> InvalidateRect (null); Break;
DEFAULT:
Break;
}
}
}
Return (0);
}
---- 6. Add "Native IP Address" in the program menu item:
Void CSerView :: onip ()
{
Int wsareturn;
Wsareturn = WSAStartup (0x0101, & wsadata);
IF (wsareturn == 0) {
Gethostname (Hostname, 260);
Struct hostent * phostent;
Phostent = gethostbyname (Hostname);
IF (phostent! = null) {
WSPrintf (Hostaddress, "% d.% d.% d.% d",
(phostent-> h_addr_list [0] [0] & 0x00FF),
(phostent-> h_addr_list [0] [1] & 0x00FF),
(Phostent-> h_addr_list [0] [2] & 0x00FF),
(phostent-> h_addr_list [0] [3] & 0x00FF));
CString Out;
Out.Format (Hostaddress);
AFXMessageBox (OUT);
}
}
}
---- 7. Add "Send Messages" in the Program menu:
Void CSerView :: OnsendMessage ()
{
// Todo: add your command handler code here
Char msg [2000];
Csend SendMessage;
IF (sendMessage.domodal ()
== iDok &&! SendMessage.m_Message.Isempty ())
{
WSPRINTF (MSG, "R:" SendMessage.m_Message);
Sendto (M_Sock, MSG, 1024, 0,
(PSOCKADDR) & SACLNT, SACLNTLEN;
M_Data [count ] = sendMessage.m_message;
Flag = true;
INVALIDATERECT (NULL);
}
}
---- 8. To send a message item, add a dialog box, named Send, have a text box, used to send a message. Add the cstring m_message variable for the text box, and add a #include in ServerView.cpp. " Send.h "
---- 9. Add a judgment function to the send message item:
Void CserveView :: onupdatesendMessage
(CCMDUI * PCMDUI)
{
// Todo: add your command update
Ui Handler Code Here
PCMDUI-> Enable (false);
IF (Isconnect)
PCMDUI-> Enable (TRUE);
}
---- 10. Re-window Display Message:
Void CServerView :: OnDraw (CDC * PDC)
{IF (flag)
{sizetotal.cy = 20;
For (INT J = 65; J
Textout (10, y, m_data [i]);
Y = 20;
}
// Todo: Add Draw Code for Native Data HERE
}
---- 11. Click in Settings in Project to select the LINK item to add WSOCK32.LIB. Last compiler, you can get a server.exe program. --- Now introduce the client program:
---- 1. Create a project called "Client", single document interface.
---- 2. Add code in ClientView.h:
#include "winsock.h"
Add variables:
CString M_Data [1000];
Handle M_Hlistenthread;
Socket m_sock;
SockAddr_in m_sasrvr;
Boolisconnect;
INT country;
CSIZE SIZETAl;
Boolflag;
---- 3. Initialization variables in the constructor:
CClientView :: CClientView ()
{
// Todo: Add Construction Code Here
ISCONNECT = FALSE;
Sizetotal.cy = 350;
Sizetotal.cx = 300;
Flag = false;
}
---- 4. Complete the clear operation in the destructor:
CClientView :: ~ cclientview ()
{IF (m_binitialized)
WSACLEANUP ();
CloseSocket (M_SOCK);
IF (m_hlistenthread)
:: TerminateThread (M_HlistentHread, 0);
}
---- 5. Add a "dial" item in the menu:
Void cclientview :: overdial ()
{
// Todo: add your command handler code here
Count = 5;
IF (m_binitialize)
{
AfxMessageBox ("already DIALING");
Return;
}
CDIAL DIAL;
IF (Dial.domodal () ==
IDOK &&! Dial.m_hostaddress.Isempty ())
{
m_sasrvr.sin_family = AF_INET;
m_sasrvr.sin_addr.s_un.s_addr = HTONL
(INADDR_And);
m_sasrvr.sin_addr.s_un.s_addr = inet_addr
Dial.m_hostaddress;
m_sasrvr.sin_port = htons (5050);
Int status;
Wsadata wsadata;
m_data [0] = "Initializing Windows Sockets DLL ...."
IF ((status = wsastartup (0x0101, & wsadata)) == 0)
{
m_data [0] = "succeeded";
m_binitialized = true;
}
Else
{
m_binitialized = false;
}
M_Sock = Socket (AF_INET, SOCK_DGRAM, 0);
M_data [1] = "CREATING Socket ....";
IF (m_sock == invalid_socket)
{
m_data [1] = "failed";
}
m_data [1] = "succeeded";
M_Data [2] = "Binding Socket ....";
SockAddr_in SA;
sa.sin_family = af_inet;
Sa.sin_addr.s_un.s_addr = HTONL (INADDR_ANY);
sa.sin_port = htons (0);
IF (Bind (M_SockAddr) & Sa,
SIZEOF (SA)) == Socket_ERROR)
{
m_data [2] = "failed";
CloseSocket (M_SOCK);
}
m_data [2] = "succeeded";
M_data [3] = "CREATING LISTENER THREAD ....";
Unsigned long idthread;
m_hlistenthread = CreateThread (null, 0,
(Lpthread_start_routine) Listen,
(void *) THIS, 0, & idthread;
IF (m_hlistenthread)
{m_data [3] = "succeeded";
M_data [4] = "waiting ....";
}
Else
m_data [4] = "failed";
INVALIDATERECT (NULL);
}
}
---- 6. Add a dial-up dialog, named Dial, have a text box to write the IP address. Add code to the clientView.cpp:
#include dial.h
---- 7. Add a judgment function in the dial item:
Void CClientView :: onupdatedial
(CCMDUI * PCMDUI)
{
// Todo: add your command update
Ui Handler Code Here
PCMDUI-> Enable (TRUE);
IF (Isconnect)
PCMDUI-> Enable (false);
}
---- 8. Add a thread that receives and send messages:
Long WinAPI Listen (CClientView * PView)
{
Char msg [2000];
PView-> m_data [5] = "Sending attach command";
PView-> InvalidateERECT (NULL);
WSPRINTF (MSG, "A:");
Sendto (PView-> M_Sock, MSG, 1024, 0,
(PSOCKADDR) & pView-> M_SASRVR, SIZEOF
(pView-> m_sasrvr);
Int Sasrvrlen, nchar;
While (1)
{
SASRVRLEN = SIZEOF (pView-> m_sasrvr);
nchar = recvfrom (pview-> m_sock, msg, 1024, 0,
(PSOCKADDR) & pView-> m_sasrvr, & sasrvrlen;
IF (nchar <0) {pview-> m_data [pView-> count ] = "Error in Recvform";
PView-> InvalidateERECT (NULL);
}
Else
{
PView-> m_data [pView-> count ] = msg;
PVIEW-> isconnect = TRUE;
PView-> flag = true;
PView-> InvalidateERECT (NULL);
}
}
Return (0);
}
---- 9. Do a send message item as the main program, the code is as above.
---- 10. The display procedure is also the same as the main program, the code is as above.
---- 12. The compiler can get the client.exe program.
---- Server.exe and Client.exe After completing, you can do it in the network under TCP / IP protocol. By the above example, you can quickly understand the advantages of VC network programming, you can also add other Function item, I don't have more narratives here. I hope that my program can play the purpose of throwing bricks, let us have a good network program.