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.
#include<winsock2.h>
#include<stdio.h>
// #pragma comment(lib, ws2_32.lib)
int main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET SendingSocket;
// Server/receiver address
SOCKADDR_IN ServerAddr, ThisSenderInfo;
// Server/receiver port to connect to
unsigned int Port = 7171;
int RetCode;
// Be careful with the array bound, provide some checking mechanism...
char sendbuf[1024] = This is a test string from sender;
int BytesSent, nlen;
// Initialize Winsock version 2.2
WSAStartup(MAKEWORD(2,2), &wsaData);
printf(Client: Winsock DLL status is %s.\n, wsaData.szSystemStatus);
// Create a new socket to make a client connection.
// AF_INET = 2, The Internet Protocol version 4 (IPv4) address family, TCP protocol
SendingSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(SendingSocket == INVALID_SOCKET)
{
printf(Client: socket() failed! Error code: %ld\n, WSAGetLastError());
// Do the clean up
WSACleanup();
// Exit with error
return -1;
}
else
printf(Client: socket() is OK!\n);
// Set up a SOCKADDR_IN structure that will be used to connect
// to a listening server on port 5150. For demonstration
// purposes, let's assume our server's IP address is 127.0.0.1 or localhost
// IPv4
ServerAddr.sin_family = AF_INET;
// Port no.
ServerAddr.sin_port = htons(Port);
// The IP address
ServerAddr.sin_addr.s_addr = inet_addr(127.0.0.1);
// Make a connection to the server with socket SendingSocket.
RetCode = connect(SendingSocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
if(RetCode != 0)
{
printf(Client: connect() failed! Error code: %ld\n, WSAGetLastError());
// Close the socket
closesocket(SendingSocket);
// Do the clean up
WSACleanup();
// Exit with error
return -1;
}
else
{
printf(Client: connect() is OK, got connected...\n);
printf(Client: Ready for sending and/or receiving data...\n);
}
// At this point you can start sending or receiving data on
// the socket SendingSocket.
// Some info on the receiver side...
getsockname(SendingSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
printf(Client: Receiver IP(s) used: %s\n, inet_ntoa(ServerAddr.sin_addr));
printf(Client: Receiver port used: %d\n, htons(ServerAddr.sin_port));
// Sends some data to server/receiver...
BytesSent = send(SendingSocket, sendbuf, strlen(sendbuf), 0);
if(BytesSent == SOCKET_ERROR)
printf(Client: send() error %ld.\n, WSAGetLastError());
else
{
printf(Client: send() is OK - bytes sent: %ld\n, BytesSent);
// Some info on this sender side...
// Allocate the required resources
memset(&ThisSenderInfo, 0, sizeof(ThisSenderInfo));
nlen = sizeof(ThisSenderInfo);
getsockname(SendingSocket, (SOCKADDR *)&ThisSenderInfo, &nlen);
printf(Client: Sender IP(s) used: %s\n, inet_ntoa(ThisSenderInfo.sin_addr));
printf(Client: Sender port used: %d\n, htons(ThisSenderInfo.sin_port));
printf(Client: Those bytes represent: \%s\\n, sendbuf);
}
if( shutdown(SendingSocket, SD_SEND) != 0)
printf(Client: Well, there is something wrong with the shutdown(). The error code: %ld\n, WSAGetLastError());
else
printf(Client: shutdown() looks OK...\n);
// When you are finished sending and receiving data on socket SendingSocket,
// you should close the socket using the closesocket API. We will
// describe socket closure later in the chapter.
if(closesocket(SendingSocket) != 0)
printf(Client: Cannot close \SendingSocket\ socket. Error code: %ld\n, WSAGetLastError());
else
printf(Client: Closing \SendingSocket\ socket...\n);
// When your application is finished handling the connection, call WSACleanup.
if(WSACleanup() != 0)
printf(Client: WSACleanup() failed!...\n);
else
printf(Client: WSACleanup() is OK...\n);
return 0;
}
8. Build and run the program. The following screenshot shows a sample expected output if there is no error during the build and run stages. The 10061 error code indicates that there is no listening socket for the given IP address and port number. We need to run the server/receiver first.