- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在进行的一个项目要求客户端通过 UDP 联系服务器,然后使用服务器在对等点之间建立 token 环网络。服务器收集每个客户端/对等点的 IP 和端口,然后将它们存储到数组中。然后,服务器将这些数组的元素通过网络发送回对等点。然后,对等点使用此信息相互连接,而不是与服务器连接。我在同行之间传输和接收消息时遇到问题。使用打印语句,我已经能够确定地址结构包含正确的端口和地址。我可能正在处理缓冲区问题或某种计时问题。我已经多次重新配置我的代码,但似乎无法使其工作。此时任何提示将不胜感激。
编辑——使用wireshark,我已经能够确定该消息确实是通过网络发送的。程序在以下函数的 while 循环中停止。但是没有收到消息
//Thread function to check for messages on the socket
void receiveMessages(int socket) {
long int nBytes = -1;
char buffer[BUFFERSIZE];
//Wait to receive message from other peers
while (nBytes <= 0) {
nBytes = recvfrom(socket, buffer, BUFFERSIZE, 0, NULL, NULL);
}
//Print the message received
printf("%s", buffer);
}
主程序
//
// runPeer.c
// tokenRing
//
// Created by Bryce Hagar on 2/13/17.
// Copyright © 2017 Bryce Hagar. All rights reserved.
//
#include <stdio.h>
#include "bbpeer.h"
int main(int argc, const char * argv[]){
//Used for creating the Client-Server socket
int clientSocket;
//Create a local peer
Host localPeer = createHost(true, true);
//Get user information; update local peer
getUserInfo(localPeer, argc, argv);
//Configure socket structure with local peer info
configSockStruct(localPeer, INADDR_ANY, localPort);
//Create a remote server
Host remoteServer = createHost(false, false);
//Configure socket structure with remote server info
configSockStruct(remoteServer, remoteIP, remotePort);
//Create a socket bound to the local peer
clientSocket = createSocket(localPeer);
//Announce peer's existence to server and receive acceptance
announceToServer(localPeer, remoteServer, clientSocket);
//Create new remote peer host structure
Host remotePeer = getPeerInfo(clientSocket);
freeHost(remoteServer);
//Send messages to peers
sendMessageToPeer(clientSocket, remotePeer, localPeer);
//Receive messages from other peers
receiveMessages(clientSocket);
return 0;
}
对等 ADT
//
// bbpeer.c
// bbpeer
//
// Created by Bryce Hagar on 2/16/17.
// Copyright © 2017 Bryce Hagar. All rights reserved.
//
#include "bbpeer.h"
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <pthread.h>
#define BUFFERSIZE 1024
#define ACCEPTED "accepted"
#define NEW "new"
#define TEST "test"
int localPort, remotePort; //User input globals
const char * remoteIP;
pthread_t newThread;
/* Get user input from command line */
void getUserInfo(Host localPeer, int argc, const char *argv[]) {
int j = 1;
//Error check for input issues
if (!localPeer->isPeer) {
printf("User input is only applicable for peers.\n");
exit(EXIT_FAILURE);
}
//Get user input from command line
if (argc == 6) {
//Connecting to new token ring (server),
if (!strcmp(argv[1],"-new")) {
localPeer->newRing = true;
j++;
}
}
//Assign arguments to global variables
localPort = atoi(argv[j++]);
remoteIP = argv[j++];
remotePort = atoi(argv[j]);
}
//Send announcement to server, and wait for acknoledgement
void announceToServer(Host localPeer, Host remoteServer, int clientSocket) {
long int nBytes; //Used to send messages
char buffer[BUFFERSIZE];
while(!localPeer->accepted){
//Announce new peer message to server
memset(buffer, 0, BUFFERSIZE);
strcpy(buffer, NEW);
nBytes = strlen(buffer) + 1;
//Send message to server
sendto(clientSocket,buffer,nBytes,0,(struct sockaddr *)&remoteServer->sockAddr,
remoteServer->addr_size);
//Receive message from server
nBytes = recvfrom(clientSocket,buffer,BUFFERSIZE,0,NULL, NULL);
//If accepted, set flag
if (!strcmp(buffer, ACCEPTED)) {
localPeer->accepted = true;
printf("ACCEPTED BY SERVER\n");//(debug)
}
}
}
//Get info from server message to peers
Host getPeerInfo(int clientSocket) {
long int numBytes = -1;
int port;
char buffer[BUFFERSIZE];
char *ip;
//Clear buffer, wait for message from server
memset(buffer, 0, BUFFERSIZE);
while (numBytes <= 0) {
numBytes = recvfrom(clientSocket, buffer, BUFFERSIZE, 0, NULL, NULL);
}
//Tokenize the message into ip and port
ip = strtok(buffer, "\n");
port = atoi(strtok(NULL, "\n"));
//Create a new host struct for the remote peer
Host remotePeer = createHost(true, false);
//Configure the socket structure for the new remote peer
configSockStruct(remotePeer, ip, port);
return remotePeer;
}
////////////////////////// Possible Error //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
/////////// ////////////////////////////////////////////////////////////////////////
//Send message to remote peer from local peer
void sendMessageToPeer(int p2pSocket, Host remotePeer, Host localPeer) {
long int nBytes;
char buffer[BUFFERSIZE];
bzero(buffer, BUFFERSIZE);
strcpy(buffer, TEST);
//Send "test" message
nBytes = strlen(buffer)+1;
//Send message to the socket(debug)
sendto(p2pSocket,buffer,nBytes,0,(struct sockaddr *)&remotePeer->sockAddr,
remotePeer->addr_size);
//Print the ip and port stored in the remote peer host (debug)
printf("%s:%d\n", inet_ntoa(remotePeer->sockAddr.sin_addr),
ntohs(remotePeer->sockAddr.sin_port));
}
//Thread function to check for messages on the socket
void receiveMessages(int socket) {
long int nBytes = -1;
char buffer[BUFFERSIZE];
//Wait to receive message from other peers
while (nBytes <= 0) {
nBytes = recvfrom(socket, buffer, BUFFERSIZE, 0, NULL, NULL);
}
//Print the message received
printf("%s", buffer);
}
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////// Possible Error //////////////////////////////////////
主机ADT
//
// host.c
// bbserver
//
// Created by Bryce Hagar on 2/17/17.
// Copyright © 2017 Bryce Hagar. All rights reserved.
//
#include "host.h"
/* Allocate memory for new host struct,
assigns variables for peers and servers*/
Host createHost(bool isPeer, bool isLocal) {
Host newHost = malloc(sizeof(*newHost));
newHost->addr_size = sizeof newHost->sockAddr;
newHost->isPeer = isPeer;
newHost->isLocal = isLocal;
if (isPeer) {
newHost->newRing = false;
newHost->hasToken = false;
newHost->accepted = false;
}
return newHost;
}
void freeHost(Host thisHost) {
free(thisHost);
}
/* Configure socket structure */
void configSockStruct(Host thisHost, const char *ip, int port) {
memset((void *) &thisHost->sockAddr, 0, (size_t)sizeof(thisHost->sockAddr));
thisHost->sockAddr.sin_family = AF_INET;
memset(thisHost->sockAddr.sin_zero, '\0', sizeof thisHost->
sockAddr.sin_zero);
thisHost->sockAddr.sin_port = htons(port);
if (!thisHost->isLocal) {
//Get address from functions parameters
struct hostent *hostptr = gethostbyname(ip);
memcpy((void *)&thisHost->sockAddr.sin_addr,
(void *)hostptr->h_addr, hostptr->h_length);
}
else {
thisHost->sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
}
}
int createSocket(Host thisHost) {
//Create UDP socket
int newSocket = socket(AF_INET, SOCK_DGRAM, 0);
bind(newSocket, (struct sockaddr *)&thisHost->sockAddr,
sizeof(thisHost->sockAddr));
return newSocket;
}
最佳答案
经过数小时徒劳的故障排除,缩小了问题范围后,我发现我的计算机 (Mac) 阻止我的程序接收消息。该程序第一次在大学的 SSH 服务器上尝试时就成功了。到目前为止,我已经使用 ssh 服务器作为我的客户端-服务器程序的服务器,并在本地创建了客户端(对等点)。在服务器上都尝试过之后,第一次就成功了。
关于c - 绑定(bind) UDP 套接字时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318697/
我的应用程序从一个有 5 个选项卡的选项卡栏 Controller 开始。一开始,第一个出现了它的名字,但其他四个没有名字,直到我点击它们。然后根据用户使用的语言显示名称。如何在选项卡栏出现之前设置选
我有嵌套数组 json 对象(第 1 层、第 2 层和第 3 层)。我的问题是数据表没有出现。任何相关的 CDN 均已导入。该表仅显示部分。我引用了很多网站,但都没有解决我的问题。 之前我使用标准表来
我正在尝试设置要显示的 Parse PFLoginViewController。这是我的一个 View Controller 的类。 import UIKit import Parse import
我遇到了这个问题,我绘制的对象没有出现在 GUI 中。我知道它正在被处理,因为数据被推送到日志文件。但是,图形没有出现。 这是我的一些代码: public static void main(Strin
我有一个树状图,其中包含出现这样的词...... TreeMap occurrence = new TreeMap (); 字符串 = 单词 整数 = 出现次数。 我如何获得最大出现次数 - 整数,
因此,我提示用户输入变量。如果变量小于 0 且大于 10。如果用户输入 10,我想要求用户再次输入数字。我问时间的时候输入4,它说你输入错误。但在第二次尝试时效果很好。例如:如果我输入 25,它会打印
我已经用 css overflow 属性做了一个例子。在这个例子中我遇到了一个溢出滚动的问题。滚动条出现了,但没有工作意味着每当将光标移动到滚动条时,在这个滚动条不活动的时间。我对此一无所知,所以请帮
我现在正在做一个元素。当您单击一个元素时,会出现以下信息,我想知道如何在您单击下一个元素而不重新单击同一元素时使其消失....例如,我的元素中有披萨,我想单击肉披萨看到浇头然后点击奶酪披萨看到浇头和肉
我有一个路由器模块,它将主题与正则表达式进行比较,并将出现的事件与一致的键掩码链接起来。 (它是一个简单的 url 路由过滤,如 symfony http://symfony.com/doc/curr
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: mysql_fetch_array() expects parameter 1 to be resource, bo
我在底部有一个带有工具栏的 View ,我正在使用 NavigationLink 导航到该 View 。但是当 View 出现时,工具栏显示得有点太低了。大约半秒钟后,它突然跳到位。它只会在应用程序启
我试图在我的应用程序上为背景音乐添加一个 AVAudioPlayer,我正在主屏幕上启动播放器,尝试在应用程序打开时开始播放但出现意外行为... 它播放并立即不断创建新玩家并播放这些玩家,因此同时播放
这是获取一个数字,获取其阶乘并将其加倍,但是由于基本情况,如果您输入 0,它会给出 2 作为答案,因此为了绕过它,我使用了 if 语句,但收到错误输入“if”时解析错误。如果你们能提供帮助,我真的很感
暂停期间抛出异常 android.os.DeadObjectException 在 android.os.BinderProxy.transactNative( native 方法) 在 androi
我已经为猜词游戏编写了一些代码。它从用户输入中读取字符并在单词中搜索该字符;根据字符是否在单词中,程序返回并控制一些变量。 代码如下: import java.util.Random; import
我是自动化领域的新手。这是我的简单 TestNG 登录代码,当我以 TestNG 身份运行该代码时,它会出现 java.lang.NullPointerException,双击它会突出显示我导航到 U
我是c#程序员,我习惯了c#的封装语法和其他东西。但是现在,由于某些原因,我应该用java写一些东西,我现在正在练习java一天!我要创建一个为我自己创建一个虚拟项目,以便让自己更熟悉 Java 的
我正在使用 Intellij,我的源类是 main.com.coding,我的资源文件是 main.com.testing。我将 spring.xml 文件放入资源文件中。 我的测试类位于 test.
我想要我的tests folder separate到我的应用程序代码。我的项目结构是这样的 myproject/ myproject/ myproject.py moduleon
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 因此,我尝试比较 2 个值,一个
我是一名优秀的程序员,十分优秀!