2014-03-13 103 views
0

我正在執行客戶端(Windows)和服務器(Linux RT)之間的通信在c。我已經爲Windows操作系統(一臺筆記本電腦)和linux操作系統(另一臺筆記本電腦)的服務器代碼編寫了客戶端代碼。我通過以太網電纜連接兩臺筆記本電腦,並將它們配置在同一子網上。Windows客戶端和Linux服務器之間的通信?

SERVER.c:Linux的

#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#define BUFLEN 512 
#define PORT 9930 

void err(char *str) 
{ 
    perror(str); 
    exit(1); 
} 

int main(void) 
{ 
    struct sockaddr_in my_addr, cli_addr; 
    int sockfd, i; 
    socklen_t slen=sizeof(cli_addr); 
    char buf[BUFLEN]; 

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 
     err("socket"); 
    else 
     printf("Server : Socket() successful\n"); 

    bzero(&my_addr, sizeof(my_addr)); 
    my_addr.sin_family = AF_INET; 
    my_addr.sin_port = htons(PORT); 
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); 

    if (bind(sockfd, (struct sockaddr*) &my_addr, sizeof(my_addr))==-1) 
     err("bind"); 
    else 
     printf("Server : bind() successful\n"); 

    while(1) 
    { 
     if (recvfrom(sockfd, buf, BUFLEN, 0, (struct sockaddr*)&cli_addr, 

&slen)==-1) 
      err("recvfrom()"); 
     printf("Received packet from %s:%d\nData: %s\n\n", 
       inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), buf); 
    } 

    close(sockfd); 
    return 0; 
} 

CLIENT.c - 窗戶

#pragma comment(lib, "Ws2_32.lib") 

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <time.h> 
#include <winsock.h> 
#include <io.h> 
#define BUFLEN 512 
#define PORT 9930 

void err(char *str) 
{ 
    perror(str); 
    exit(1); 
} 

int main(void) 
{ 
    struct sockaddr_in my_addr, cli_addr; 
    int sockfd, i; 
    socklen_t slen=sizeof(cli_addr); 
    char buf[BUFLEN]; 
    WORD wVersionRequested; 
    WSADATA wsaData; 

    printf("Initializing Winsock\n"); 
    wVersionRequested = MAKEWORD (1, 1); 
    if (WSAStartup (wVersionRequested, &wsaData) != 0){ 
     printf("Winsock initialised failed \n"); 
    } else { 
     printf("Initialised\n"); 


if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 
    err("socket"); 

bzero(&serv_addr, sizeof(serv_addr)); 
serv_addr.sin_family = AF_INET; 
serv_addr.sin_port = htons(PORT); 
if (inet_aton(argv[1], &serv_addr.sin_addr)==0) 
{ 
    fprintf(stderr, "inet_aton() failed\n"); 
    exit(1); 
} 


    while(1) 
{ 
    printf("\nEnter data to send(Type exit and press enter to exit) : "); 
    scanf("%[^\n]",buf); 
    getchar(); 
    if(strcmp(buf,"exit") == 0) 
     exit(0); 

    if (sendto(sockfd, buf, BUFLEN, 0, (struct sockaddr*)&serv_addr, slen)==-1) 
     err("sendto()"); 
} 

close(sockfd); 
return 0; 

}

我的問題:

  • 是否可以這樣進行通信??
  • 我是否想要採取特定的措施?

請給這方面的想法?

+0

當然可以。或者你認爲需要知道服務器運行什麼操作系統才能查看特定的網頁? – PMF

+0

@PMF OP的問題是關於_directly_通過電纜連接兩臺筆記本電腦。沒有涉及網絡。 – arkascha

+0

我想交叉編譯嗎? – kiran

回答

1

您可以直接(通過以太網線)連接兩個系統,但通常你必須使用一個特殊的電纜:它被稱爲「交叉線」。否則,不可能連接。

較新的網絡控制器實現對這種設置的檢測,所以有可能使用標準的電纜,對於這種設置,但是這取決於網絡控制器建成兩個系統上。您將不得不嘗試或諮詢文檔。

而且它migh是你必須選擇在MS-Windows上側(網絡適配器配置中)一些特殊的配置這個工作。我幾次遇到了標準設置的通信問題。您可以向Google諮詢這些設置。

+0

雖然這在理論上是正確的,但是現在的以太網控制器AFAIK通常會在硬件中檢測到,如果使用標準電纜而不是交叉電纜並相應地用硬件處理,那麼這兩種電纜都可以工作。但是,使用交叉電纜是正確的方法。 – anishsane

+0

這實際上是真的,謝謝你提到這一點。因此,如果可以使用標準電纜或需要交叉電纜,則取決於網絡控制器內置於筆記本電腦中。我相應地調整了答案。 – arkascha

+0

你可以看到我的上面的代碼。它在客戶端顯示錯誤爲:未定義的引用到winsock,未定義的引用到套接字@ 2,未定義的引用到bzero,未定義的引用到htons @ 4 – kiran

相關問題