Socket
网络套接字类型,派生自handle,封装了底层socket的接口,用于支持协程间的socket通信。
举个例子:
socket.gs
const int PORT = 4678;
int size = 0;
int sum = 0;
handle sem_id = sync_object.create_semaphore();
// Connect to server & receve data until peer closed
void start_client()
{
handle fd = socket.create();
fd.connect("127.0.0.1", PORT);
for (;;)
{
let int ret, buffer buf = fd.recv(1024);
if (ret <= 0)
break;
size += ret;
for (int i = 0 upto buf.length() - 1)
if (buf[i] >= '0' && buf[i] <= '9')
sum += buf[i];
}
fd.close();
sem_id.give();
}
string data = __FILE__ + "1234567890";
data = data + data + data + data + data;
data = data + data;
const int N = 3000;
void start_server()
{
handle sfd = socket.create();
sfd.set_opt(SockOptLevel.SOCKET, SockOpt.REUSEADDR, 1);
sfd.bind(SockParam.INADDR_ANY, PORT);
sfd.listen(64);
// Send N times to single client
let handle cfd, int ip = sfd.accept();
for(int i = 1 upto N)
cfd.send(data);
cfd.close();
sem_id.take();
printf("sum = %d,",sum);
printf("size = %d\n", size);
}
void test()
{
coroutine.create(0, "start_server");
coroutine.create(0, "start_client");
}
test();
socket常 用的外部函数
下面列出socket类型一些常用的外部函数以及用法。
1.
socket socket.create(int af = 0, int type = 0)
创建socket
2.
array socket_instance.accept()
接收来自监听端口的链接
3.
bool socket_instance.close()
关闭socket
4.
int socket_instance.bind(string/int address, int port)
将socket绑定到指定地址
5.
int socket_instance.connect(mixed address, int port)
客户端发起连接,成功返回0,失败返回-1
6.
int socket_instance.listen( int backlog = 128)
服务端监听端口,参数是最多允许的连接数,成功返回0,失败返回-1
7.
int socket_instance.set_opt(int level, int optname, int value)
设置socket的选项,返回错误码
8.
array socket_instance.recv(int len)
从socket接收数据,len是接收缓冲区长度。成功时返回实际接收长度和缓冲区数据,失败时返回错误码。
9.
array socket_instance.recv_from(int len)
从socket接收数据,与recv不同的是,成功时还要返回对端ip、port。
10.
array socket.select(array/int? read_mask, array/int? write_mask, array/int? except_mask, int/float timeout = -1)
以select方式接收/发送数据。
11.
int socket_instance.send(string/buffer data)
发送数据
12.
int socket_instance.send_to(string/buffer data, string/buffer ip, int port)
发送数据到指定对端