【发布时间】:2017-04-22 20:55:03
【问题描述】:
所以,我正在尝试构建一个用作 Websockets 服务器的 C 应用程序。这里有很多相关的问题,但似乎没有一个能够帮助解决这个问题。该程序能够初步建立连接,成功完成 websocket 的握手,但是似乎无法保持连接打开。在客户端,我收到错误
WebSocket.js:7605 未捕获错误:尝试在未打开或关闭的 WebSocket 上发送消息 在 _8b2.window.WebSocket._8d2.send (WebSocket.js:7605) 在(索引):34
每当我尝试在客户端的 websocket 连接上使用 send() 函数时。而且它也给了我错误
与“ws://127.0.0.1:5959/?.kl=Y”的 WebSocket 连接失败:在建立连接之前 WebSocket 已关闭。
这里是服务器的源代码:
int new_socket;
int activity;
int i;
int sd;
int max_sd;
int bytes_read;
fd_set readfds;
int master_socket;
noPollConn* new_conn;
/*Create no poll context*/
noPollCtx* ctx = nopoll_ctx_new();
noPollConn* conn;
char buffer[3000];
/*Create a connection listener at 127.0.0.1 (loopback) on port 5959*/
noPollConn * listener = nopoll_listener_new(ctx, "127.0.0.1","5959");
/*Get the socket of the lister*/
master_socket = nopoll_conn_socket(listener);
if(!nopoll_conn_is_ok(listener)) {
perror("There was an error creating the listener!\n");
exit(EXIT_FAILURE);
}
puts("Waiting for connections ...");
while(TRUE){
printf("Start of the while loop\n");
FD_ZERO(&readfds);
FD_SET(master_socket, &readfds);
max_sd = master_socket;
printf("The number of connections is %i\n",cons);
for (i = 0 ; i < cons ; i++) {
sd = nopoll_conn_socket((noPollConn*)vector_get(clients,i));
if(sd > 0)
FD_SET(sd,&readfds);
if(sd > max_sd)
max_sd = sd;
}
printf("The max fd is %i\n",max_sd);
activity = select(max_sd + 1 , &readfds , NULL , NULL , NULL);
if ((activity < 0) && (errno!=EINTR)) {
puts("select error");
exit(EXIT_FAILURE);
}
if (FD_ISSET(master_socket, &readfds)){
new_conn = nopoll_conn_accept(ctx,listener);
puts("Waiting for the connection to be ready");
nopoll_conn_is_ready(conn);
/*Vector is actually a doubly linked list*/
vector_push(&clients,new_conn);
cons++;
}
/*TODO: Implement disconnect*/
for (i = 0; i < cons; i++){
printf("Checking on user %i\n",i);
conn = (noPollConn*)vector_get(clients,i);
sd = nopoll_conn_socket(conn);
if (FD_ISSET(sd, &readfds)){
printf("Receiving info from socket no. %d...\n",sd);
bytes_read = recv(sd,buffer,4000,MSG_DONTWAIT);
buffer[bytes_read] = '\0';
printf("Received the msg --> %s\n",buffer);
}
}
memset(buffer,0,3000);
}
只是一个警告,这段代码现在确实进入了无限循环,因为我没有在服务器端实现与客户端的断开连接。
For the client
<pre><code>
var connection = new WebSocket('ws://127.0.0.1:5959');
connection.onopen = function(){
connection.send("TEST");
alert("Connected");
}
connection.onerror = function(error){
console.log('Error detected: ' + error);
}
connection.onmessage = function (event) {
alert(event.data);
}
connection.close();
</code></pre>
也许我错过了一些非常重要的东西?我已经阅读了很多教程,但我似乎无法弄清楚问题所在。任何帮助是极大的赞赏!
在.onopen()函数中调用.send()会报错:
到 'ws://127.0.0.1:5959/?.kl=Y' 的 WebSocket 连接失败:在建立连接之前 WebSocket 已关闭。 更新
错误在服务器端。它可能与我处理连接有关,就好像它在 C 代码中的某些方面是一个套接字一样。
【问题讨论】:
-
“似乎无法保持连接打开。”,“也许我错过了一些非常重要的东西?”你为什么打电话
.close()? -
主要是出于习惯,这只是打开一个连接测试然后发送消息后关闭。我尝试在没有 .close() 的情况下运行它,但它会产生相同的错误。如果我可以问,有理由不这样做吗?我认为一旦不再使用连接,最好总是关闭它。
-
问题是为什么
WebSocket连接正在关闭,是吗?您在调用.send()之后的行中明确调用.close()?对c或c++不太熟悉,虽然listener定义在noPollConn * listener之前? -
您可能还有其他问题,但我没有看到您正在实施 webSocket 协议的任何地方。 webSocket 连接不是普通的 TCP 连接。它以 HTTP 连接开始,请求升级到 webSocket 协议,然后交换安全密钥,所有数据必须采用 webSocket 数据帧格式。如果服务器不遵循该过程,则客户端将断开连接。详情请见writing webSocket servers on MDN。
-
我会考虑查看 facil.io 或其他 C websocket 库...这应该可以让您专注于您的应用程序和您想要的功能,而不是传输层。