Сокету UDP не нужно делать connect, однако ему нужно сделать bind (присвоить адрес). Для отправки сообщений использовать sendto. при создании сокета AF_INET/SOCK_DGRAM не обязательно указывать IPPROTO_UDP - в протоколе IP нет другого датаграммного транспортного протокола.
Вот пример кода клиента, который отправляет сообщение по протоколу UDP в сети IPv6 (это почти тоже самое, что IP, только адрес больше размером)
#include <winsock2.h>
#include <ws2ip6.h>
#include <stdio.h>
#define ADDR_BUF_LEN 100
#define DST_BUF_LEN 200
int
main(int argc, char ** argv)
{
char hello[] = "Hello!";
char * msg = hello;
char dst_buf[DST_BUF_LEN];
unsigned char * a;
struct sockaddr_in6 src_addr, dst_addr;
SOCKET src_sock, dst_sock;
char addr_buf[ADDR_BUF_LEN];
size_t addr_len, len;
struct sockaddr_in6 * from;
int err;
WSADATA wsaData;
WORD wVersionRequested;
if (argc < 3)
{
printf("<command> ipv6_address port [message]\n");
exit(1);
}
if (argc > 3)
{
msg = argv[3];
}
wVersionRequested = MAKEWORD(2, 0);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("Failed to initialize WSA\n");
exit(-1);
}
src_sock = socket(AF_INET6, SOCK_DGRAM, 0);
if (src_sock == INVALID_SOCKET)
{
printf("Failed to bind source socket, error %d\n",
WSAGetLastError());
exit(-1);
}
memset(&src_addr, 0, sizeof(src_addr));
memset(&dst_addr, 0, sizeof(dst_addr));
src_addr.sin6_family = AF_INET6;
dst_addr.sin6_family = AF_INET6;
err = inet_pton(AF_INET6, argv[1], &dst_addr.sin6_addr);
if (err != 1)
{
printf("Failed to convert address %s\n", argv[1]);
exit(1);
}
dst_addr.sin6_port = htons(atoi(argv[2]));
printf("Destination address: %s\n", argv[1]);
printf("Destination port: %d\n",atoi(argv[2]));
// Use system source address
src_addr.sin6_port = htons(0x400);
err = bind(src_sock, &src_addr, sizeof(src_addr));
if (err)
{
printf("Failed to bind source socket, error %d\n",
WSAGetLastError());
exit(-1);
}
err = sendto(src_sock, msg, strlen(msg)+1, 0,
&dst_addr, sizeof(dst_addr));
if(err < 0)
{
err = WSAGetLastError();
printf("sendto failed, error code %d\n", err);
exit(-1);
}
printf("Sent to destination: %s\n", msg);
return 0;
}