I truly need help on this. I am trying to write a test program that simulate a network environment that have 5 clients and 1 server. To do so, I need to be able to edit IP header to change it's source address and various other values in the header. To change it, I need to use socket raw and IP_HRINCL socket option.

However, it doesn't work during the send with error 10049, "Address not available" from WSAGetLastError(). I am wondering how would I do so, and can I please look at a simple example on how to change your IP header and send it. By the way, I am using winsock with VC++, and my os is XP. I know there are some issues regarding XP's compatibility with Raw socket. In addition, if winsock is not a viable option, is there anyway for me to write in lower socket?

Here's my code

Code:
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>

using namespace std;

int initialize();

void main()
{
	initialize();
	SOCKET sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
	int error;
	char on = 1; 
	setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on)); 


	if(sock == INVALID_SOCKET)
		cout << "Crap raw socket " << endl;

	/*  Header data */
	unsigned char header[32] = {0x45,0x00,0x00,0x20,0x01,0xf1,0x00,0x00,0x05,0x11,0x9c,0x0a,0x05,0x3a,0x38,0x02,0xe0,
		0x02,0xfa,0x93};
	
	memset(header+20,0,12);
	
	SOCKADDR_IN sock_add;
	sock_add.sin_family = AF_INET;
	sock_add.sin_port = htons(1542);
	sock_add.sin_addr.s_addr = inet_addr("192.168.1.1");
	
	error = sendto(sock,(char*)header,32,0,(LPSOCKADDR)&sock_add,sizeof(SOCKADDR_IN));
	
	
}

int initialize()
{
	int t;
	/*  Before any Winsock function to work, we need to call to wsock.dll to initialize those 
		functions */
	WSADATA wsa_data;
	t = WSAStartup(MAKEWORD(1,1), &wsa_data);

	if(t != 0)
		return -1;
	else 
		return 0;
}