After TCP programming is complete, it is UDP's turn below. This is for connectionless and simpler.
Familiarize yourself with the following process:
UDP socket:
Server (acceptor) Program
:
1. Create a socket ).
2. Bind the socket to a local address and port (BIND ).
3. Waiting for receiving data (recvfrom ).
4. Close the socket.
Client (sender) Program
:
1. Create a socket ).
2. Send data (sendto) to the server ).
3. Close the socket.
The following code continues:
Server
# Include <winsock2.h> <br/> # include <iostream> <br/> using namespace STD; <br/> # pragma comment (Lib, "ws2_32.lib ") <br/> int startudpsrv () <br/>{< br/> # pragma region initialize the socket library </P> <p> wsadata; <br/> int iresult = wsastartup (makeword (1, 1), & wsadata); // release 1.1 <br/> If (no_error! = Iresult) <br/>{< br/> cout <"error at wsastartup ()/n"; <br/> return-1; <br/>}< br/> If (lobyte (wsadata. wversion )! = 1 | <br/> hibyte (wsadata. wversion )! = 1) <br/>{< br/> wsacleanup (); <br/> return-1; <br/>}// exit if not 1.1 <br/> # pragma endregion initializes the socket library <br/> # pragma region creates a socket <br/> // create socket for listening for incoming connection requests <br/> socket socketsrv = socket (af_inet, sock_dgram, ipproto_udp); <br/> If (invalid_socket = socketsrv) <br/>{< br/> cout <"error at socket (): /n "<wsagetlasterror (); <br/> wsacleanup (); <br/> return-1; <br />}< Br/> # pragma endregion create a socket <br/> # pragma region bind a socket <br/> int err; <br/> sockaddr_in addrsrv; <br/> addrsrv. sin_family = af_inet; <br/> addrsrv. sin_addr.s_un.s_addr = htonl (inaddr_any); <br/> addrsrv. sin_port = htons (8086); <br/> err = BIND (socketsrv, (sockaddr *) & addrsrv, sizeof (addrsrv )); <br/> If (socket_error = ERR) <br/> {<br/> cout <"error at bind! /N "<wsagetlasterror (); <br/> closesocket (socketsrv); <br/> wsacleanup (); <br/> return-1; <br/>}< br/> # pragma endregion binding socket <br/> # pragma region waiting for receiving <br/> sockaddr_in addrclient; <br/> int Len = sizeof (sockaddr); </P> <p> char recvbuf [100]; <br/> while (1) <br/>{< br/> memset (recvbuf, '*', sizeof (char) * 100 ); // empty accept array <br/> err = recvfrom (socketsrv, recvbuf, strlen (recvbuf), 0, (sockaddr *) & addrclient, & Le N); <br/> int len2 = strlen (recvbuf); <br/> If (socket_error = ERR) <br/>{ <br/> cout <"error at recvfrom SRV! /N "<wsagetlasterror (); <br/>/* closesocket (socketsrv); <br/> wsacleanup (); <br/> return-1; */<br/>}< br/> cout <recvbuf <Endl; <br/> /*********************************** ***********************************/<br />/* send data */<br/> /*************************** **************************************** * *****/<br/> char sendbuf [100]; <br/> sprintf_s (sendbuf, 100, "Welcome % s to this UDP Service! ", Inet_ntoa (addrclient. sin_addr); <br/> err = sendto (socketsrv, sendbuf, strlen (sendbuf) + 1, 0, (sockaddr *) & addrclient, sizeof (sockaddr )); <br/> If (socket_error = ERR) <br/> {<br/> cout <"error at srvsendto! /N "<wsagetlasterror (); <br/> closesocket (socketsrv); <br/> wsacleanup (); <br/> return-1; <br/>}< br/> # pragma endregion waiting for receiving <br/> closesocket (socketsrv); <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> int main (void) <br/>{< br/> startudpsrv (); <br/> // system ("pause"); <br/> return 0; <br/>}
Client code:
# Include <winsock2.h> <br/> # include <iostream> <br/> using namespace STD; <br/> # pragma comment (Lib, "ws2_32.lib ") <br/> int calludpclient () <br/>{< br/> # pragma region initialize the socket library <br/> wsadata; <br/> int iresult = wsastartup (makeword (1, 1), & wsadata); // release 1.1 <br/> If (no_error! = Iresult) <br/>{< br/> cout <"error at wsastartup ()/n"; <br/> return-1; <br/>}< br/> If (lobyte (wsadata. wversion )! = 1 | <br/> hibyte (wsadata. wversion )! = 1) <br/>{< br/> wsacleanup (); <br/> return-1; <br/>}// exit if not 1.1 <br/> # pragma endregion initializes the socket library <br/> # pragma region creates a socket <br/> // create socket for listening for incoming connection requests <br/> socket socketclient = socket (af_inet, sock_dgram, ipproto_udp); <br/> If (invalid_socket = socketclient) <br/>{< br/> cout <"error at socket (): /n "<wsagetlasterror (); <br/> wsacleanup (); <br/> return- 1; <br/>}< br/> # pragma endregion create a socket <br/> # pragma region send data <br/> sockaddr_in addrsrv; <br/> addrsrv. sin_family = af_inet; <br/> addrsrv. sin_addr.s_un.s_addr = inet_addr ("127.0.0.1"); <br/> addrsrv. sin_port = htons (8086); <br/> int Len = sizeof (sockaddr); <br/> // char sendbuf [100] = "Hello! This is UDP client! "; <Br/> char sendbuf [100]; <br/> gets_s (sendbuf); <br/> int err = sendto (socketclient, sendbuf, strlen (sendbuf) + 1, 0, (sockaddr *) & addrsrv, Len); <br/> If (socket_error = ERR) <br/>{ <br/> cout <"error at sendto client:/N" <wsagetlasterror (); <br/> closesocket (socketclient ); <br/> wsacleanup (); <br/> return-1; <br/>}< br/> # pragma endregion sends data </P> <p> # pragma region accepts data <br/> char recvbuf [100]; <br/> err = recvfrom (socketclient, recvbuf, strlen (recvbuf), 0, (sockaddr *) & addrsrv, & Len ); <br/> If (socket_error = ERR) <br/> {<br/> cout <"error at recvfrom client:/N" <wsagetlasterror (); <br/> closesocket (socketclient); <br/> wsacleanup (); <br/> return-1; <br/>}< br/> cout <recvbuf <Endl; <br/> # pragma endregion accepts data <br/> closesocket (socketclient ); <br/> wsacleanup (); <br/> return 1; <br/>}< br/> int main () <br/>{< br/> calludpclient (); <br/> system ("pause"); <br/> return 0; <br/>}
Under the test, the code is fine.
But now our code has the same problem as TCP. The size of data received by the server we set is 1024; but what if it is greater than this? Hey, next decomposition.