【问题标题】:Receiving bytes on server in C from Android从 Android 接收 C 中服务器上的字节
【发布时间】:2017-05-15 07:28:48
【问题描述】:

我已成功将我的安卓手机作为客户端连接到作为服务器的树莓派。

下一步是使用字节向树莓派发送数据。我在 Java 中为 Android 做的正确吗?

socket.getOutputStream().write(String.valueOf(progress).getBytes());

此后,在我的树莓派方面,我将不得不接收 C 中的字节。我在服务器上接收数据时遇到了问题。这是我的代码。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main(){
  int welcomeSocket,clientSocket;
  char buffer[1024];
  struct sockaddr_in serverAddr;
  struct sockaddr_storage serverStorage;
  socklen_t addr_size;
  ssize_t nread;

  /*---- Create the socket. The three arguments are: ----*/
  /* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */
  welcomeSocket = socket(PF_INET, SOCK_STREAM, 0);

  /*---- Configure settings of the server address struct ----*/
  /* Address family = Internet */
  serverAddr.sin_family = AF_INET;
  /* Set port number, using htons function to use proper byte order */
  serverAddr.sin_port = htons(9999);
  /* Set IP address to localhost */
  serverAddr.sin_addr.s_addr = INADDR_ANY;
  /* Set all bits of the padding field to 0 */
  memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

  /*---- Bind the address struct to the socket ----*/
  bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr));

  /*---- Listen on the socket, with 5 max connection requests queued ----*/
  if(listen(welcomeSocket,5)==0){
    printf("Listening\n");
}
  else
    printf("Error\n");

  /*---- Accept call creates a new socket for the incoming connection ----*/
  addr_size = sizeof serverStorage;
  clientSocket = accept(welcomeSocket, (struct sockaddr *) &serverStorage, &addr_size);
  printf("Successfully Connected!!!\n\r");

  //Receive data from android  
  //recv(welcomeSocket,buffer,1024,0);
  nread = recvfrom(clientSocket, buffer,1024, 0, (struct sockaddr *) &serverStorage, &addr_size);
  if(nread==-1)
  perror("Error!");
  else
  printf("Data received: %s",buffer);


return 0;

}

根据 Pravin 的评论,我尝试使用 Recvfrom 和 perror,它显示错误为 -1。

【问题讨论】:

  • 是的,您可以使用 recv() 来接收字节。 recv 的返回值是什么?是“0”还是“-1”?您可以使用 perror() 或 errno 来显示错误消息。
  • 对不起,recv的返回值如何显示?只需执行 return recv(socket,buffer,BUFSIZ,0); ?
  • 要获得返回值,您可以保存在变量 retVal=recv() 中。参考man recv 和recv/recvfrom 的例子参考link 中的例子。
  • 啊,我明白了,好的,谢谢,我明天试试,告诉你结果!
  • 谢谢普拉文!我解决了这个问题。我也可以问一下,我如何设置一个收听,所以如果只有当我在 android 上按发送时,我的 pi 上的接收就会运行?我应该做一个 While(1) 循环吗?

标签: android c sockets server serversocket


【解决方案1】:

好的!我意识到了这个问题。我意识到我没有使用之前创建的客户端套接字。我继续使用服务器的套接字大声笑。一开始没注意。我用一个例子来看看我的服务器和例子服务器有什么不同,这真的很有帮助!

http://www.binarytides.com/server-client-example-c-sockets-linux/

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 2021-03-21
    • 2020-09-17
    • 2017-06-14
    • 1970-01-01
    • 2013-08-06
    • 2020-06-04
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多