Chromeアプリケーションと連携して、サーバーからのTCP接続を介してデータを受信することはできません。私はonReceivedイベントを取得しません。 2回目にのみ動作しますが、1回目では動作しません。私はドキュメントからすべてをコピーしましたが、コードはうまくいかず、何が間違っているのか分かりません。私は私の 'ABCDEFGHI'文字列がサーバーによってtcpdumpウィンドウに送信されているのを見ることができますが、何らかの理由でChromeがそれを取得しません。この例のエラーは完全に再現可能です。ここではファイルは、以下のとおりです。ネットワークからのChromeアプリケーション受信(TCP)データの例が失敗します。
APP
[[email protected] nettest]$ ls -l
total 16
-rw-rw-r-- 1 niko niko 174 Aug 6 16:10 background.js
-rw-rw-r-- 1 niko niko 208 Aug 6 16:11 main.html
-rw-rw-r-- 1 niko niko 928 Aug 6 16:54 main.js
-rw-rw-r-- 1 niko niko 281 Aug 6 16:10 manifest.json
[[email protected] nettest]$
manifest.jsonを:
[[email protected] nettest]$ cat manifest.json
{
"name": "Receive Test",
"description": "Network receive test App.",
"version": "0.1",
"manifest_version": 2,
"app": {
"background": {
"scripts": ["background.js"]
}
},
"icons": {
},
"sockets": {
"tcp" : {
"connect": ["*"]
}
}
}
[[email protected] nettest]$
background.js:
[[email protected] nettest]$ cat background.js
chrome.app.runtime.onLaunched.addListener(function() {
chrome.app.window.create('main.html', {
'outerBounds': {
'width': 400,
'height': 500
}
});
});
[[email protected] nettest]$
main.htmlと:
[[email protected] nettest]$ cat main.html
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="/main.js"></script>
</head>
<body>
<div>Networking test app</div>
<a href="" id="connect_btn">conect</a>
</body>
</html>
[[email protected] nettest]$
main.js:
[[email protected] nettest]$ cat main.js
var socket;
window.addEventListener("load",init);
function init() {
var el;
el=document.getElementById('connect_btn');
if (el!=null) el.addEventListener("click",connect_click);
}
function connect_click(event) {
event.preventDefault();
chrome.sockets.tcp.create({}, function(createInfo) {
socket=createInfo.socketId;
chrome.sockets.tcp.setPaused(socket, false);
chrome.sockets.tcp.connect(socket,"localhost", 4433, connect_callback);
});
}
function connect_callback(info) {
console.log("connection accepted: "+info);
chrome.sockets.tcp.setPaused(socket, false);
chrome.sockets.tcp.onReceiveError.addListener(receive_error);
chrome.sockets.tcp.onReceive.addListener(data_received);
}
function data_received(info) {
console.log("the data has been received:");
console.log(info);
}
function receive_error(info) {
console.log("receive error");
console.log(info);
}
[[email protected] nettest]$
サーバコード:
[[email protected] src]$ cat server.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int flag=1;
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
char data[10] = {'A','B','C','D','E','F','G','H','I','\n'};
int result;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
result = setsockopt(listenfd,IPPROTO_TCP,TCP_NODELAY,(char *) &flag, sizeof(int));
if (result<0) {
printf("result=%d\n",result);
return (1);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(4433);
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
result = setsockopt(connfd,IPPROTO_TCP,TCP_NODELAY,(char *) &flag, sizeof(int));
if (result<0) {
printf("result=%d\n",result);
return (1);
}
printf("connection accepted, sending data\n");
write(connfd, &data, sizeof(data));
sleep(5);
close(connfd);
printf("connection closed\n");
sleep(1);
}
}
[[email protected] src]$
私は、コードを実行すると、これが出力されます:
connection accepted: 0
main.js:31 receive error
main.js:32 Object {resultCode: -100, socketId: 18}
main.js:20 connection accepted: 0
main.js:27 the data has been received:
main.js:28 Object {data: ArrayBuffer, socketId: 19}
main.js:27 the data has been received:
main.js:28 Object {data: ArrayBuffer, socketId: 19}
main.js:31 receive error
main.js:32 Object {resultCode: -100, socketId: 19}
間違っている可能性が何上の任意のアイデア?
私はserver.cでaccept()syscallの後にsleep(1)を追加することがわかりました。しかし、これは私には使えません。それは時間が浪費しています。 – Nulik