-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmysocket.sc
121 lines (100 loc) · 3.46 KB
/
mysocket.sc
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
import "var.sc"
[public]
class TcpSocket
sockfd: int
servaddr: sockaddr_in
port: int
TcpSocket()
@sockfd = socket(AF_INET, SOCK_STREAM, 0)
if sockfd == -1
perror("can't create socket\n")
TcpSocket(sockfd: int, addr: sockaddr_in)
@sockfd = sockfd
@servaddr = addr
int connectToServ(ip: const char*, port: int)
memset(&@servaddr, 0, sizeof(@servaddr))
@servaddr.sin_family = AF_INET
@servaddr.sin_port = htons(port)
@servaddr.sin_addr.s_addr = inet_addr(ip)
if connect(sockfd, (sockaddr*)&@servaddr, sizeof(@servaddr)) == -1
perror("can't connect to server!\n")
return -1
return 0
int send(buf: const void*, len: int) = global::send(sockfd, buf, len, 0)
int recv(buf: void*, len: int) = global::recv(sockfd, buf, len, 0)
int sendString(str: const char*) = send(str,strlen(str))
int close() = global::close(sockfd)
string readLine(res_code: int*)
res: string
buf: char[BUF_SIZE + 1]
loop
memset(buf,0,sizeof(buf))
len := recv(buf,BUF_SIZE)
if len > 0
res += string(buf)
if strstr(buf,"\r\n")?
*res_code=0
return res
else
*res_code = -1
return res
int sendFile(file_name: const char*)
buf: char[READ_BUF_SIZE]
file := fopen(file_name, "r")
if not file then return -1
defer fclose(file)
read_size, total_size := 0
while (read_size = fread(buf,1,READ_BUF_SIZE,file)) > 0
send(buf,read_size)
total_size += read_size
return total_size
int recvFile(file_name: const char*)
buf: char[READ_BUF_SIZE];
file := fopen(file_name, "w")
if not file then return -1
defer fclose(file)
recv_len, total_size := 0
while (recv_len = recv(buf, READ_BUF_SIZE)) > 0
fwrite(buf, 1, recv_len, file)
total_size += recv_len
return total_size
[public]
class TcpServer: TcpSocket
int bindAndListen(port: int)
memset(&servaddr,0,sizeof(servaddr))
servaddr.sin_family = AF_INET
servaddr.sin_addr.s_addr = htonl(INADDR_ANY)
servaddr.sin_port = htons(port)
if bind(sockfd, (sockaddr*)&servaddr, sizeof(servaddr)) != 0
perror("bind failed\n")
return -1
if listen(sockfd,5)!=0
perror("listen failed\n")
return -1
return 0
TcpSocket getOneConn()
loop
connfd: int
connaddr: sockaddr_in
addrsz: socklen_t = sizeof(connaddr)
connfd = accept(sockfd, (sockaddr*)&connaddr, &addrsz)
if connfd == -1
perror("invalid connection\n")
continue;
printf("new connection\n");
return TcpSocket(connfd,connaddr)
TcpSocket getConn()
loop
connfd: int
connaddr: sockaddr_in
addrsz: socklen_t = sizeof(connaddr)
connfd = accept(sockfd, (sockaddr*)&connaddr, &addrsz)
if connfd == -1
perror("invalid connection\n")
continue
if fork() == 0
//in child
printf("new connection\n")
return TcpSocket(connfd,connaddr)
//else
//in parent blocked in accept again!