2011-09-19 70 views
0
/* A simple server in the internet domain using TCP 
    The port number is passed as an argument */ 
    #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; 
} 










======>>>now client code 


#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); 
    fgets(buffer,255,stdin); 
    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; 
} 

// IM新手,所以請忽略愚蠢的方式來問希望收到由客戶端發送服務器的消息包....用C

這個代碼是在n得到簡單的字符串/ W 。現在我想得到一個預定義的標準消息發送和接收,因爲我必須定義一個結構,

現在我的問題是我怎麼能發送和得到一個結構的N/W在C語言。 plzzzz幫助我。 強大的文本

回答

0

很好,看寫的原型:

ssize_t write(int fd, const void *buf, size_t count); 

第二個參數是一個通用的空指針,這樣你就可以發送任何你想要的。在那裏放置你想傳輸的結構地址和它的大小。

還有endiannes被考慮(小vs大端)。如果正在通信的機器具有不同的字節順序,那麼這種方法不起作用。看看那些conversion functions像htons,ntohs,...

如果你想發送的數據結構存儲你的原始類型使用機器字節順序,發送整個結構不起作用。您應該存儲在網絡順序的每個值,例如:

struct foo{ 
    uint32_t a; 
    uint16_t b; 
}foo; 

foo f; 
f.a = htonl(10); 
f.b = htons(5); 

write(fd, (void *)&f, sizeof(foo)); 
+0

我認爲這是值得指出的是,使用這種方法,它是你的責任,以確保結構填充是在連接的兩端是一致的。如果服務器和客戶端使用不同的編譯器和/或操作系統,這可能是一個問題。同樣,字節碼也需要注意。 – NPE

+0

@aix:我解決了我的問題。請檢查它並告訴我是否有任何錯誤。 – Heisenbug

+0

謝謝。我現在明白了。其工作正常。再次感謝 – user651109

相關問題