Dưới đây là một số mã cơ bản đang cố gắng sử dụng dữ liệu OOB (Khẩn cấp). Vấn đề của tôi là phần máy chủ không hoạt động giống nhau nếu máy khách ở trong C hoặc trong Java. Quan trọng, bạn có thể nghĩ rằng điều gì đó phức tạp ở cả phía máy khách nhưng nếu tôi sử dụng máy chủ C (để kiểm soát tốt hơn OOB), thì cả hai khách hàng đều hoạt động giống như điều khiển OOB phía máy chủ của tôi.Dữ liệu Java Out Of Band (được gọi là "dữ liệu khẩn cấp")
Đầu máy chủ (Java) phần:
Socket s = ss.accept();
s.shutdownOutput();
s.setOOBInline(true);
InputStream is = s.getInputStream();
for (;;) {
byte []d = new byte[3];
int l = is.read(d);
if (l==-1) break;
for (int i=0; i<l; i++) System.out.print((char)d[i]);
System.out.println();
Thread.sleep(2000);
}
Sau đó khách hàng (Java) phần:
Socket s = new Socket("localhost",61234);
s.shutdownInput();
OutputStream os = s.getOutputStream();
byte []n = new byte[10];
for (int i=0; i<n.length; i++) n[i] = (byte)('A'+i);
byte m = (byte)('0');
os.write(n);
System.out.println("normal sent");
s.sendUrgentData(m);
System.out.println("OOB sent");
os.write('Z');
System.out.println("normal sent");
và sau đó khách hàng thay thế (C) phần:
s = socket(PF_INET,SOCK_STREAM,0);
bzero(&a,sizeof(a));
a.sin_family = AF_INET;
a.sin_port = htons(61234);
a.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(s,(struct sockaddr *)&a,sizeof(a));
shutdown(s,SHUT_RD);
char m = '0';
char *n = "ABCDEFGHIJ";
printf("normal sent %d\n",write(s,n,strlen(n)));
printf("OOB sent %d\n",send(s,&m,1,MSG_OOB));
printf("normal sent %d\n",write(s,"Z",1));
Bây giờ đây là những gì tôi nhận được (khách hàng C đầu tiên, sau đó là máy khách Java):
Accepting connection
ABC
DEF
GHI
J
Z
Accepting connection
ABC
DEF
GHI
J
0Z
Dường như máy chủ Java không thể xem dữ liệu OOB được gửi từ phía máy khách C. Tại sao 0
dường như đã bị mất? Nó đã không, bởi vì máy chủ có ít nhất phát hiện ranh giới oob trong dòng.
[Trích từ wikipedia] (http://en.wikipedia.org/wiki/Out-of-band#Computing): "Trong mạng máy tính, dữ liệu ngoài băng tần (được gọi là" ** dữ liệu khẩn cấp ** "trong TCP) trông - cho ứng dụng - giống như một luồng dữ liệu riêng biệt từ luồng dữ liệu chính." - Những người down down thân mến, đây không phải là một câu hỏi * khẩn cấp *, nó là về * dữ liệu khẩn cấp *. –
Điều này không trả lời được câu hỏi của tôi. Trước tiên, bạn có thể nhận thấy rằng tôi đặt cờ OOBInline, thứ hai là nó hoạt động với một máy khách nhưng không hoạt động với một máy khách khác. –
Đây không phải là câu trả lời. Nó chỉ là rất nhiều người downvoted câu hỏi của bạn bởi vì họ đọc "khẩn cấp" trong tiêu đề ... –