- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更新:根据建议更新了 src。 strcat a\n\0 到命令并更改 sizeof。客户端在发送时“成功”,但服务器在接收时从未“成功”。
我已经付出了很多努力来尝试让一个常规的旧 TCP 套接字工作。我基本上有一个简单的客户端和服务器设置。目前我在我的服务器上没有收到任何东西,我在我的客户端上只收到 4 个字节(本例中为“GOTY”)。
服务器输出输出这个并继续:
RECEIVED (null)
客户端输出只会阻塞并且永远不会停止。如果我终止服务器,我会得到这个输出
Connect success
Received Response:
服务器
int Server::update(char *getbuf)
{
int ready = poll(pollfds, 1, 100);
if (ready == -1)
{
logger.info("Poll failed");
return FALSE;
}
if (pollfds[0].revents & POLLIN)
{
ssize_t z;
logger.info("Connection available");
struct sockaddr_in client_address;
memset(&client_address, 0, sizeof client_address);
socklen_t alen = sizeof(client_address);
// ACCEPT
clientsocket = accept(serversocket, (struct sockaddr *)&client_address, &alen);
if(!clientsocket)
logger.fail("Accept Fail");
// READ
z = recv(clientsocket, getbuf, 512, MSG_WAITALL);
if (z < 0)
fprintf(stderr,"receive failure\n");
else
fprintf(stderr,"receive succeed\n");
getbuf[z] = 0;
respond(getbuf);
//closeConnection();
logger.data("RECEIVED %s", getbuf);
getbuf[z] = 0;
return TRUE;
}
return FALSE;
}
void Server::respond(char *response)
{
// SEND
ssize_t z;
z = send(clientsocket, response, strlen(response), 0);
if (z < 0)
fprintf(stderr,"send failure\n");
else
fprintf(stderr,"send succeed\n");
}
客户
我添加了客户端代码。我现在使用 strlen,但它似乎无济于事。
int main(int argc, char **argv)
{
int abort = 0;
int port;
in_addr_t address;
char *command;
ssize_t z;
int com_socket;
struct sockaddr_in server_address;
struct timeval timeout;
int opt;
int val = 0;
char getbuf[512];
//Defaults
address = inet_addr("127.0.0.1");
port = 4949;
//INCLUDED ARGUMENTS FROM CLI
while((opt = getopt(argc, argv, "a:p:c:")) > 0)
{
switch(opt)
{
case 'a':
address = inet_addr(optarg);
break;
case 'p':
port = atoi(optarg);
break;
case 'c':
abort = 1;
command = (char *)optarg;
break;
default:
fprintf(stderr, "-a IPADDRESS -p PORT -c COMMAND\n",argv[0]);
}
}
// Server
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(port);
server_address.sin_addr.s_addr = address;
if (server_address.sin_addr.s_addr == INADDR_NONE)
fprintf(stderr, "Server address failed\n");
if(!abort)
{
fprintf(stderr, "No Command given\n");
fprintf(stderr, "-a IPADDRESS -p PORT -C COMMAND\n");
exit(0);
}
else
{
fprintf(stderr, "Address %s Port %d Command %s\n", inet_ntoa(server_address.sin_addr), port, command);
}
// Create com_socket
com_socket = socket(PF_INET, SOCK_STREAM, 0);
if (com_socket == -1)
fprintf(stderr, "Socket failed\n");
/*
// Client
struct sockaddr_in client_address;
memset(&client_address,0,sizeof client_address);
client_address.sin_family = AF_INET;
client_address.sin_port = 0;
client_address.sin_addr.s_addr = ntohl(INADDR_ANY);
if (client_address.sin_addr.s_addr == INADDR_NONE)
fprintf(stderr, "Client address failed\n");
// Bind
z= bind(com_socket, (struct sockaddr *)&client_address, sizeof (client_address));
if ( z == -1 )
fprintf(stderr,"Binding port\n");
*/
timeout.tv_sec = 2; /* 2 seconds */
timeout.tv_usec = 0; /* + 0 usec */
socklen_t addrlen = sizeof(struct sockaddr_in);
// Connect
//z = connectWithTimeout(com_socket, (struct sockaddr *) &server_address, len_inet, &timeout);
z = connect(com_socket, (struct sockaddr *) &server_address, sizeof(server_address));
if(z == -1)
{
if(errno == EINPROGRESS)
{
fprintf(stderr, "EINPROGRESS non block start\n");
}
if(errno == EALREADY)
{
fprintf(stderr, "EALREADY non block subsequent request\n");
}
fprintf(stderr, "Connect failed\n");
}
else
fprintf(stderr, "Connect success\n");
strcat(command, "\n\0");
// SEND
z = send(com_socket, command, strlen(command)+2, 0);
if (z < 0)
fprintf(stderr,"send failure\n");
else
fprintf(stderr,"send succeed\n");
// READ
z = recv(com_socket, getbuf, 512, MSG_WAITALL);
if (z < 0)
fprintf(stderr,"receive failure\n");
else
fprintf(stderr,"receive succeed\n");
// Output
fprintf(stderr, "Received Response: %s\n", getbuf);
close(com_socket);
exit(1);
}
我只是不知道为什么这不起作用。我一遍又一遍地检查它。
这是一个嵌入式Linux系统。
最佳答案
在服务器中:这完全是错误的。 strlen() 返回在 read()/recv() 之前缓冲区中的字符串的长度。
// READ
z = recv(clientsocket, getbuf, strlen(getbuf), MSG_WAITALL);
if (z < 0)
fprintf(stderr,"receive failure\n");
此外:在 respond() 中,strlen() 假定响应“string”是空终止的。它不是。
z = send(clientsocket, response, strlen(response), 0);
并且客户端代码中似乎存在相同类型的错误。
更新:由于 OP 不知道如何在没有字符串函数的情况下生存,我将说明如何做到这一点。
... snipped ...
// READ
z = recv(clientsocket, getbuf, 512, MSG_WAITALL);
if (z < 0) {
// .... if (errno == EAGAIN) continue;
fprintf(stderr,"receive failure %d(%s) \n"
, errno, strerror(errno) );
break; }
fprintf(stderr,"receive succeed\n");
respond(getbuf, z);
return TRUE;
}
return FALSE;
}
void respond(char *response, size_t siz)
{
// SEND
size_t done;
ssize_t z;
for (done = 0; done < siz; done += z) {
z = send(clientsocket, response+done, siz-done, 0);
if (z < 0) {
if (errno == EAGAIN) continue;
fprintf(stderr,"send failure %d(%s)\n"
, errno, strerror(errno) );
break; }
fprintf(stderr,"send succeed\n");
}
}
关于linux - BSD套接字不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9043343/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!