windows-nt/Source/XPSP1/NT/net/tcpip/samples/connopt/connopt.c
2020-09-26 16:20:57 +08:00

121 lines
3.4 KiB
C

/*++
Copyright (c) 2000, Microsoft Corporation
Module Name:
connotp.c
Abstract:
This module demonstrates the use of the SO_CONNOPT socket option
to include IP-layer options in outgoing TCP and UDP messages.
It allows a TCP connection to be established to a specified target,
such that all segments for the connection contain a source-route.
Author:
Abolade Gbadegesin (aboladeg) 7-October-1999
Revision History
--*/
#include <winsock2.h>
#include <mswsock.h>
#include <stdio.h>
#include <stdlib.h>
#define IP_OPT_LSRR 0x83
int __cdecl
main(
int argc,
char* argv[]
)
{
SOCKET Socket;
SOCKADDR_IN SockAddrIn;
WSADATA wd;
//
// Check arguments, initialize Windows Sockets,
// and create a new TCP socket for the outgoing connection.
//
if (argc < 3) {
printf("Usage: connopt <server-IP-address> <server-port> <hop>*\n");
return 0;
}
WSAStartup(0x202, &wd);
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET) {
printf("socket: %d\n", WSAGetLastError());
} else {
//
// Bind the socket in preparation for constructing the source route.
//
SockAddrIn.sin_family = AF_INET;
SockAddrIn.sin_addr.s_addr = INADDR_ANY;
SockAddrIn.sin_port = 0;
if (bind(
Socket, (PSOCKADDR)&SockAddrIn, sizeof(SockAddrIn)
) == SOCKET_ERROR) {
printf("bind: %d\n", WSAGetLastError());
} else {
ULONG i;
UCHAR IpOptions[256] = {IP_OPT_LSRR, 0, 4, 0};
ULONG IpOptionsLength = 4;
//
// Construct a source route from the command-line parameters,
// in the format in which it would appear in the IP header.
// Install the resulting buffer using SO_CONNOPT.
//
for (i = 0; i < (ULONG)argc - 3; i++) {
*(ULONG UNALIGNED *)(IpOptions + 3 + i * 4) =
inet_addr(argv[i + 3]);
}
{
*(ULONG UNALIGNED *)(IpOptions + 3 + i * 4) =
inet_addr(argv[1]);
i++;
}
IpOptionsLength += i * 4;
IpOptions[1] = (UCHAR)IpOptionsLength - 1;
IpOptions[IpOptionsLength - 1] = 0;
if (setsockopt(
Socket, SOL_SOCKET, SO_CONNOPT, IpOptions, IpOptionsLength
) == SOCKET_ERROR) {
printf("setsockopt: %d\n", WSAGetLastError());
} else {
//
// Establish a connection the the target,
// and send a few messages.
//
SockAddrIn.sin_family = AF_INET;
SockAddrIn.sin_addr.s_addr = inet_addr(argv[1]);
SockAddrIn.sin_port = htons((SHORT)atol(argv[2]));
if (connect(
Socket, (PSOCKADDR)&SockAddrIn, sizeof(SockAddrIn)
) == SOCKET_ERROR) {
printf("connect: %d\n", WSAGetLastError());
} else {
CHAR Message[4096] = "Text string.\n";
for (i = 0; i < 20; i++) {
send(Socket, Message, sizeof(Message), 0);
}
shutdown(Socket, SD_SEND);
closesocket(Socket);
}
}
}
}
return 0;
}