2016-03-10 125 views
0

我基本上試圖讀取Raspberry Pi(我的客戶端)上的加速計數據並將它們發送到服務器(EC2 ubuntu實例)。亞馬遜EC2套接字編程(C)

這是我的客戶端代碼:

#include "./sensor.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

void error(const char *msg) 
{ 
    perror(msg); 
    exit(0); 
} 

int main(int argc, char *argv[]) 
{ 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    char buffer[256]; 
    if (argc < 4) { 
     fprintf(stderr,"usage %s hostname port\n", argv[0]); 
     exit(0); 
    } 
    int delay = atoi(argv[3]); 
    portno = atoi(argv[2]); 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    server = gethostbyname(argv[1]); 
    if (server == NULL) { 
     fprintf(stderr,"ERROR, no such host\n"); 
     exit(0); 
    } 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr, 
     server->h_length); 
    serv_addr.sin_port = htons(portno); 
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
     error("ERROR connecting"); 
    int acc[6]; 
    enableIMU(); 
    while(1){ 
    bzero(buffer,256); 
    readACC(acc); 
    sprintf(buffer,"%d\t%d\t%d\t\n", acc[0], acc[1], acc[2]); 
    n = write(sockfd,buffer,strlen(buffer)); 
    if (n < 0) 
     error("ERROR writing to socket"); 
    if (n < 0) 
     error("ERROR reading from socket"); 
    printf("%s\n",buffer); 
    } 
    close(sockfd); 
    return 0; 
} 

這裏是我的服務器代碼:

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

void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd, portno; 
    socklen_t clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(argv[1]); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
       sizeof(serv_addr)) < 0) 
       error("ERROR on binding"); 
    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd, 
       (struct sockaddr *) &cli_addr, 
       &clilen); 
    if (newsockfd < 0) 
      error("ERROR on accept"); 
    bzero(buffer,256); 
    n = read(newsockfd,buffer,255); 
    if (n < 0) error("ERROR reading from socket"); 
    printf("Here is the message: %s\n",buffer); 
    n = write(newsockfd,"I got your message",18); 
    if (n < 0) error("ERROR writing to socket"); 
    close(newsockfd); 
    close(sockfd); 
    return 0; 
} 

我把這個命令行我的客戶,看看我的加速度計讀數:

./client ec2-54-187-93-10.us-west-2.compute.amazonaws.com 8000 

然後我把這條線放在我的服務器上,什麼也看不到:

./server 8000 

這是安全組我的實例:

Type   Protocol   Port Range    Source 
HTTP    TCP     80     0.0.0.0/0 
Custom TCP Rule TCP    8000     0.0.0.0/0 
SSH    TCP     22     0.0.0.0/0 

你知道我在做什麼錯?我將衷心感謝您的幫助。

+0

建議您使用調試器或向代碼中添加一些更基本的調試語句以幫助您追蹤執行情況。例如,當服務器成功接受連接時,甚至沒有調試打印。 – kaylum

+0

服務器和客戶端彼此是本地的,它似乎工作正常。這很可能是一方或另一方的防火牆問題。 – dbush

回答

0

找到問題的幾點提示。 您可以使用它來查找您的服務器是否啓動。

fuser 8000/tcp 

如果它是好的,你可以使用telnet:

telnet localhost:8000 

並嘗試送東西到你的服務器,你的情況是這樣的話:

printf("Here is the message: %s\n",buffer); 

如果可以的話看到那個端口很忙,但是你看不到通過telnet發送的收到的消息,那麼你應該更多地調試到客戶端並發現問題。

+0

這些是如何進一步調試問題的好建議。但這不是一個真正的答案,應作爲評論發佈。 – kaylum