-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsini_socket.cpp
More file actions
146 lines (119 loc) · 3.4 KB
/
Copy pathsini_socket.cpp
File metadata and controls
146 lines (119 loc) · 3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "sini_socket.h"
#include "sini_io.h"
#include <string.h>
#include <stdio.h>
#ifdef WIN32
# include <Winsock2.h>
#endif
bool sini_sockinit()
{
WSAData data;
return (WSAStartup( 0x0202, &data ) == 0);
}
bool sini_sockdelete()
{
return (WSACleanup() == 0);
}
sini_socket sini_createsocket( bool UDP )
{
if (!UDP)
return (sini_socket)(socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ));
else
return (sini_socket)(socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ));
}
bool sini_bind( sini_socket sock, unsigned short port )
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ADDR_ANY;
addr.sin_port = htons( port );
return (bind( (SOCKET)sock, (sockaddr*)&addr, sizeof(addr) ) == 0);
}
bool sini_closesocket( sini_socket sock )
{
return (closesocket( (SOCKET)sock ) == 0);
}
bool sini_listen( sini_socket sock )
{
return (listen( (SOCKET)sock, SOMAXCONN ) == 0);
}
void sini_printips()
{
char Buffer[1024];
if (gethostname( Buffer, 1024 ))
{
sini_printf( "error\n" );
return;
}
hostent *h = gethostbyname( Buffer );
if (!h)
{
sini_printf( "error\n" );
return;
}
int pos = 0;
while (h->h_addr_list[pos])
{
sini_printf( " %d.%d.%d.%d\n", (h->h_addr_list[pos][0]&0xff), (h->h_addr_list[pos][1]&0xff),
(h->h_addr_list[pos][2]&0xff), (h->h_addr_list[pos][3]&0xff) );
pos++;
}
}
sini_socket sini_accept( sini_socket sock )
{
return (sini_socket)accept( (SOCKET)sock, NULL, NULL );
}
sini_socket sini_accept( sini_socket sock, unsigned int *ip_ret, unsigned short *prot_ret )
{
sockaddr_in addr;
int len = sizeof(addr);
SOCKET ret = accept( (SOCKET)sock, (sockaddr*)&addr, &len );
*ip_ret = ntohl( addr.sin_addr.s_addr );
*prot_ret = ntohs( addr.sin_port );
return (sini_socket)ret;
}
unsigned int sini_parseip( const char *IP )
{
unsigned int Oct1, Oct2, Oct3, Oct4;
if (sscanf( IP, "%d.%d.%d.%d", &Oct1, &Oct2, &Oct3, &Oct4 ) != 4)
return 0;
return ((Oct1 << 24)|(Oct2 << 16)|(Oct3 << 8)|(Oct4));
}
bool sini_connect( sini_socket sock, unsigned int ip, unsigned short port )
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl( ip );
addr.sin_port = htons( port );
return (connect( (SOCKET)sock, (sockaddr*)&addr, sizeof(addr) ) == 0);
}
int sini_send( sini_socket sock, const char *Buffer, int Len )
{
return send( (SOCKET)sock, Buffer, Len, 0 );
}
int sini_recv( sini_socket sock, char *Buffer, int Len )
{
return recv( (SOCKET)sock, Buffer, Len, 0 );
}
bool sini_setbroadcast( sini_socket sock, bool val )
{
int i = (val)?1:0;
return (setsockopt( (SOCKET)sock, SOL_SOCKET, SO_BROADCAST, (char*)&i, sizeof(i) ) == 0);
}
int sini_sendto( sini_socket sock, const void *Data, unsigned int DataLen, unsigned int ip, unsigned short port )
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl( ip );
addr.sin_port = htons( port );
return sendto( (SOCKET)sock, (const char*)Data, (int)DataLen, 0, (sockaddr*)&addr, sizeof(addr) );
}
int sini_recvfrom( sini_socket sock, void *Buffer, unsigned int BufferLen, unsigned int *retIP, unsigned short *retPort )
{
sockaddr_in addr;
int len = sizeof(addr);
int ret = recvfrom( (SOCKET)sock, (char*)Buffer,(int)BufferLen, 0, (sockaddr*)&addr, &len );
*retIP = ntohl( addr.sin_addr.s_addr );
*retPort = ntohs( addr.sin_port );
return ret;
}