我正在尝试编写一个聊天程序,协议是 TCP,两个文件是 server.c 和 client.c,如果客户端和客户端是通过 fork 创建的并且具有相同的套接字描述符,那么如何从客户端向客户端发送消息。没有...
我正在尝试编写一个聊天程序,协议是 TCP,两个文件是 server.c 和 client.c如果它们是通过 fork 创建的并且具有相同的套接字描述符,则如何从客户端向客户端发送消息。
无论我如何尝试发送消息,它都会出现在发送消息的同一控制台窗口中
我正在尝试使用 Wifi Aware 技术在发布者和订阅者之间建立套接字连接。我正在关注来自 android 开发者网站的以下链接:https://developer.android.com/
我正在尝试使用 Wifi Aware 技术在发布者和订阅者之间创建套接字连接。我正在关注来自 Android 开发者网站的以下链接:
https://developer.android.com/develop/connectivity/wifi/wifi-aware#create_a_connection
如上所述,我从订阅者发送一条消息,该消息在服务器端成功接收,但是当我在发布者上创建服务器套接字后请求网络时,既没有收到错误,也没有接收/创建任何网络:
// 发布时调用的发布者回调方法。当消息发送成功时,它将调用 server.accept() 进行监听
public void onMessageReceived(PeerHandle peer, byte[] message, Context mContext) {
......
try{
publisherSocket = new ServerSocket(0);
publisherPort = publisherSocket.getLocalPort(0);
}
catch(...) { .... }
NetworkSpecifier networkSpecifier = new WifiAwareNetworkSpecifier.Builder(currentDiscoverySession,currentPublisherConnectedPeer).setPskPassphrase("some8Letter@").setPort(publisherPort).build;
NetworkRequest publisherNetworkRequest = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(networkSpecifier).build();
ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback(){
public void onAvailable(Network network) {
// Problem is it was never called which means network not there
currentDiscoverySession.sendMessage(currentPublisherConnectedPeer, 0, someDummyMessage);
}
.....};
// Here ConnectivityManager is obatined using this.getSystemService(this.CONNECTIVITY_SERVICE) on onCreate of activity
connectivityManager.requestNetwork(publisherNetworkRequest, callback);
// 订阅调用时的回调方法
public void onMessageReceived(PeerHandle peer, byte[] message, Context mContext) {
NetworkSpecifier networkSpecifier = new WifiAwareNetworkSpecifier.Builder(currentDiscoverySession,peer).setPskPassphrase("some8Letter@").build();
NetworkRequest subscriberNetworkRequest = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(networkSpecifier).build();
ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback(){
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities){
.....
WifiAwareNetworkInfo subscriberNetworkInfo = (WifiAwareNetworkInfo) networkCapabilities.getTransportInfo();
subscriberSocket = network.getSocketFactory().createSocket(subscriberNetworkInfo.getPeerIpv6Addr(), subscriberNetworkInfo.getPort());
// WRite some message using outputStream
.....};
我的清单文件:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="34"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
最小开发工具包:34 目标开发工具包:34
我不知道为什么当我调用 requestNetworkMethod 时它没有通过 Wifi-Aware 返回任何网络。
我尝试以毫秒为单位传递时间,发现调用了 onUnavailable() 方法,这基本上意味着没有这样的网络存在/创建。
我想知道是否有可能通过 Wifi-Aware 创建这样的套接字连接,如果是的话,那么我的代码是否有问题,或者是否由于硬件限制,如果是,我该如何知道?
我的最终目标是为 2 个应用创建一个视频通话应用,以便它们通过 WIFI-Aware 进行通信,我的目标是通过此网络发送和接收原始视频字节,而不使用任何预先存在的协议(如 WebRTC)。如果您发现此方法存在任何问题,也请告诉我。