There are two options to send data on a connectionless socket. The first, and simplest, is to create a socket and call either sendto() or WSASendTo(). We'll cover sendto() first, which is defined as:
const char FAR * buf,
const struct sockaddr FAR * to,
The parameters are the same as recvfrom() except that buf is the buffer of data to send and len indicates how many bytes to send. Also, the to parameter is a pointer to a SOCKADDR structure with the destination address of the workstation to receive the data. The Winsock 2 function WSASendTo() can also be used. This function is defined as:
const struct sockaddr FAR * lpTo,
Again, WSASendTo() is similar to its ancestor. This function takes a pointer to one or more WSABUF structures with data to send to the recipient as the lpBuffers parameter, with dwBufferCount indicating how many structures are present. You can send multiple WSABUF structures to enable scatter-gather I/O. Before returning, WSASendTo() sets the fourth parameter, lpNumberOfBytesSent, to the number of bytes actually sent to the receiver. The lpTo parameter is a SOCKADDR structure for the given protocol, with the recipient's address. The iToLen parameter is the length of the SOCKADDR structure. The last two parameters, lpOverlapped and lpCompletionRoutine, are used for overlapped I/O.
As with receiving data, a connectionless socket can be connected to an endpoint address and data can be sent with send and WSASend(). Once this association is established, you cannot go back to using sendto or WSASendTo() with an address other than the address passed to one of the connect functions. If you attempt to send data to a different address, the call will fail with WSAEISCONN. The only way to disassociate the socket handle from that destination is to call connect() with the destination address of INADDR_ANY. The following program example demonstrates how to construct a simple UDP sender application which can be used together with the previous UDP receiver program example.
1. While in the Visual C++ IDE, click File menu > Project sub menu to create a new project.
2. Select Win32 for the Project types: and Win32 Console Application for the Templates:. Put the project and solution name. Adjust the project location if needed and click OK.
3. Click Next for the Win32 Application Wizard Overview page. We will remove all the unnecessary project items.
4. In the Application page, select Empty project for the Additional options:. Leave others as given and click Finish.
5. Next, we need to add new source file. Click Project menu > Add New Item sub menu or select the project folder in the Solution Explorer > Select Add menu > Select New Item sub menu.
6. Select C++ File (.cpp) for the Templates:. Put the source file name and click Add. Although the extension is .cpp, Visual C++ IDE will recognize that the source code used is C based on the Compile as C Code (/TC) option which will be set in the project property page later.
7. Now, add the source code as given below.
// #pragma comment(lib, "ws2_32.lib")
int main(int argc, char **argv)
SOCKADDR_IN ReceiverAddr, SrcInfo;
int Port = 5150;
char *SendBuf = "Sending all my love, Sending all my love to youuu!";
int BufLength = 1024;
// Initialize Winsock version 2.2
if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
printf("Client: WSAStartup failed with error %ld\n", WSAGetLastError());
// Clean up
// Exit with error
printf("Client: The Winsock DLL status is %s.\n", wsaData.szSystemStatus);
// Create a new socket to receive datagrams on.
SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SendingSocket == INVALID_SOCKET)
printf("Client: Error at socket(): %ld\n", WSAGetLastError());
// Clean up
// Exit with error
printf("Client: socket() is OK!\n");
// Set up a SOCKADDR_IN structure that will identify who we
// will send datagrams to. For demonstration purposes, let's
// assume our receiver's IP address is 127.0.0.1 and waiting
// for datagrams on port 5150.
ReceiverAddr.sin_family = AF_INET;
ReceiverAddr.sin_port = htons(Port);
ReceiverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// Send a datagram to the receiver.
printf("Client: Data to be sent: \"%s\"\n", SendBuf);
printf("Client: Sending datagrams...\n");
TotalByteSent = sendto(SendingSocket, SendBuf, BufLength, 0, (SOCKADDR *)&ReceiverAddr, sizeof(ReceiverAddr));
printf("Client: sendto() looks OK!\n");
// Some info on the receiver side...
// Allocate the required resources
memset(&SrcInfo, 0, sizeof(SrcInfo));
len = sizeof(SrcInfo);
getsockname(SendingSocket, (SOCKADDR *)&SrcInfo, &len);
printf("Client: Sending IP(s) used: %s\n", inet_ntoa(SrcInfo.sin_addr));
printf("Client: Sending port used: %d\n", htons(SrcInfo.sin_port));
// Some info on the sender side
getpeername(SendingSocket, (SOCKADDR *)&ReceiverAddr, (int *)sizeof(ReceiverAddr));
printf("Client: Receiving IP used: %s\n", inet_ntoa(ReceiverAddr.sin_addr));
printf("Client: Receiving port used: %d\n", htons(ReceiverAddr.sin_port));
printf("Client: Total byte sent: %d\n", TotalByteSent);
// When your application is finished receiving datagrams close the socket.
printf("Client: Finished sending. Closing the sending socket...\n");
if (closesocket(SendingSocket) != 0)
printf("Client: closesocket() failed! Error code: %ld\n", WSAGetLastError());
printf("Server: closesocket() is OK\n");
// When your application is finished call WSACleanup.
printf("Client: Cleaning up...\n");
if(WSACleanup() != 0)
printf("Client: WSACleanup() failed! Error code: %ld\n", WSAGetLastError());
printf("Client: WSACleanup() is OK\n");
// Back to the system
8. Before we can build this Winsock C Win32 console application project, we need to set the project to be compiled as C code and link to ws2_32.lib, the Winsock2 library. Invoke the project property page.
9. Expand the Configuration folder > Expand the C/C++ sub folder. Select the Advanced link and for the Compile As option, select Compile as C Code (/TC).
10. Next, expand the Linker folder and select the Input link. For the Additional Dependencies option, click the ellipses at the end of the empty field on the right side.
11. Manually, type the library name and click OK or you can just directly type the library name in the empty field on the right of the Additional Dependencies. Click OK.
12. Build the project and make sure there is no error which can be seen (if any) in the Output window normally docked at the bottom of the IDE by default. Run the project and if there is no error during the build and run stages, a sample output is shown below should be expected.