跳到主要内容
版本:release

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)
发送数据到指定对端
+