2014-09-02 82 views
-1

這是我的C客戶端代碼。不知何故,它不工作。它在我嘗試傳遞參數時起作用。
我希望程序要求用戶給hostname然後它會要求portname,然後發送消息:C socket程序錯誤

Enter hostname: localhost
Enter portname: 56456
Enter message : Hi user
Enter message : What's up
Enter message : How are you

而且一旦給了它不應該要求再次(直到重新啓動該程序的主機和端口)。我試着用do while循環,但它不工作。 在服務器上會顯示已發送的郵件

這裏是我的代碼:

#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 main() 
{ 
    char *argv[256]; 
    int argc; 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 
    printf("\n\nEnter Hostname\n\n"); 
    fgets(argv[0],256,stdin); 
    char buffer[256]; 
    if (argc < 3) { 
     fprintf(stderr,"usage %s hostname port\n", argv[0]); 
     exit(0); 
    } 
    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"); 


    printf("Please enter the message: "); 
    bzero(buffer,256); 
    //buffer = tempFunc(); 
    fgets(buffer,255,stdin); 
    printf("\n\nHere Goes the output\n%s",buffer); 
    n = write(sockfd,buffer,strlen(buffer)); 
    if (n < 0) 
     error("ERROR writing to socket"); 
    bzero(buffer,256); 
    n = read(sockfd,buffer,255); 
    if (n < 0) 
     error("ERROR reading from socket"); 
    printf("%s\n",buffer); 
    close(sockfd); 
    return 0; 

} 
+0

代碼不匹配給定的輸出。 'do while'循環在哪裏? – Coconop 2014-09-02 12:12:07

+0

我刪除了這個,如果你想我會添加它 – 2014-09-02 12:13:18

+0

你嘗試使用多路複用器,如選擇,輪詢或epoll。你應該閱讀一下,因爲這個任務很簡單。 – 2014-09-02 12:16:12

回答

2

首先,不使用char * argv[256]

char buffer[256]; 
printf("\n\nEnter Hostname\n\n"); 
fgets(buffer,256,stdin); 

然後檢查Removing trailing newline character from fgets() input處理fgets

對於一個無限循環,不做

int a=2; // Useless declaration 
do 
{ 
    // Your code 
}while(a=2) // I guess you wanted (a == 2) 

使用:

while(1) 
{ 
    // Your code 
} 

或者

for(;;) 
{ 
    // Your code 
} 

看來你需要的訓練一點點,嘗試一些教程,尋找C的良好實踐,在編譯時啓用警告標誌並學習使用調試器,如gdb

P.S:

2

讓我們首先解決一些基本的東西。
你的argv是一個指針數組,指向內存中的任意位置,在這裏你的程序可能會崩潰。
接下來的事情是,當您在閱讀fgets的輸入時,您也在閱讀\n。所以localhost\n不是一個有效的主機名。用二進制零覆蓋最後一個字符,刪除\n

int main() 
{ 

    char hostname[256]; 
    char port[16]; 
    char buffer[256]; 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 
    printf("\n\nEnter Hostname\n\n"); 
    fgets(hostname, 256,stdin); 

    hostname[ strlen(hostname) - 1 ] = '\0'; 
    fgets(port, 16, stdin); 
    port[ strlen(port) - 1] = '\0'; 

    portno = atoi(port); 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    server = gethostbyname(hostname); 
    if (server == NULL) { 
     fprintf(stderr,"ERROR, no such host\n"); 
    exit(0); 
    //... 
} 
+0

它正在工作,我添加了while while while while well – 2014-09-02 12:54:57

-1

這是循環的代碼。由於@Coconop

#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() 
{ 

    char hostname[256]; 
    char port[16]; 
    char buffer[256]; 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 
    printf("\n\nEnter Hostname\n\n"); 
    fgets(hostname, 256,stdin); 

    hostname[ strlen(hostname) - 1 ] = '\0'; 
    fgets(port, 16, stdin); 
    port[ strlen(port) - 1] = '\0'; 

    portno = atoi(port); 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    server = gethostbyname(hostname); 
    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 a=2; 
do { 
    printf("Please enter the message: "); 
    bzero(buffer,256); 
    //buffer = tempFunc(); 
    fgets(buffer,255,stdin); 
    printf("\n\nHere Goes the output\n%s",buffer); 
    n = write(sockfd,buffer,strlen(buffer)); 
}while(a=2); 
    if (n < 0) 
     error("ERROR writing to socket"); 
    bzero(buffer,256); 
    n = read(sockfd,buffer,255); 
    if (n < 0) 
     error("ERROR reading from socket"); 
    printf("%s\n",buffer); 
    close(sockfd); 
    return 0; 

} 

+0

如果它解決了你的問題,你應該接受一個建議的答案並刪除這個。 另請注意,'do while'循環無用,因爲'a'在循環內沒有修改 – Coconop 2014-09-02 13:00:00

+0

@Coconop我想要一個無限循環,因爲這個原因我做了這個並且所需的輸出是正確的 – 2014-09-02 13:04:51

+1

無論如何,你不應該發佈你的如果它是基於某人的回答,那麼只有當它帶來新的東西時纔有答案。要增加你的問題的精度,你可以編輯你的帖子。 012vUpvote幫助您解決問題的所有答案,並接受更有用的答案。 – Coconop 2014-09-02 13:16:32

0

對於命令行參數,你不應該再申報argcargv!試試這個吧 -

#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 < 3) { 
       fprintf(stderr,"usage %s hostname port\n", argv[0]); 
       exit(0); 
     } 
     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"); 


     printf("Please enter the message: "); 
     bzero(buffer,256); 
     //buffer = tempFunc(); 
     fgets(buffer,255,stdin); 
     printf("\n\nHere Goes the output\n%s",buffer); 
     n = write(sockfd,buffer,strlen(buffer)); 
     if (n < 0) 
       error("ERROR writing to socket"); 
     bzero(buffer,256); 
     n = read(sockfd,buffer,255); 
     if (n < 0) 
       error("ERROR reading from socket"); 
     printf("%s\n",buffer); 
     close(sockfd); 
     return 0; 

} 

並且在你想要的地方添加do while while!