2014-03-13 102 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

相关问题