2013-03-15 2 views
1

У меня есть клиент UDP и сервер работает нормально при запуске на том же компьютере. (Здесь для клиента я дал 127.0.0.1 как IP-адрес назначения для клиента UDP).Запуск клиента и сервера UDP на разных машинах

Однако при запуске на разных машинах и замене 127.0.0.1 с моим ip-машиной, на которой присутствует server.c, программа не работает. Проблема в том, что я не получаю сообщение об ошибке.

Ниже приведен код для сервера и клиента. Скажите, пожалуйста, какие-либо изменения, которые необходимо выполнить для запуска на разных компьютерах (я использую ОС LINUX).

Примечание: Мои машины ServerIP (машина, где server.c присутствует): 10.60.5.945, ClientIP: 10.60.5.950

server.c:

#include<sys/types.h> 
#include<sys/socket.h> 
#include<netinet/in.h> 
#include<sys/stat.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<stdio.h> 
#include<fcntl.h> 
int main() 
{ 
    int cont,create_socket,new_socket,addrlen,fd; 
    int bufsize = 1024; 
    int nameLen=0; 
    int client_address_size=0; 
    char *buffer = malloc(10); 
    char fname[256]; 
    struct sockaddr_in address,client; 

    if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) > 0) 
    printf("The socket was created\n"); 

    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = INADDR_ANY; 

    address.sin_port = htons(15000); 

    if (bind(create_socket,(struct sockaddr *)&address,sizeof(address))== 0) 
     printf("Binding Socket\n"); 

    nameLen=sizeof(address); 

    if (getsockname(create_socket,(struct sockaddr *)&address,&nameLen)<0) 
    { 
     printf("\n\ngetsockname() error\n"); 
     exit(3); 
    } 

    printf("Port assigned is %d\n", ntohs(address.sin_port)); 

    client_address_size=sizeof(client); 



    if(recvfrom(create_socket,fname, 255,0,(struct sockaddr *) &client,&client_address_size)<0) 
    { 
     printf("\n\nrecvfrom() failed\n"); 
     exit(4); 
    } 

    printf("A request for filename %s Received..\n", fname); 

    if ((fd=open(fname, O_RDONLY))<0) 
    { 
     perror("File Open Failed"); 
     exit(0); 
    } 

    while((cont=read(fd, buffer, 10))>0) 
    { 
     sleep(1); 
     sendto(create_socket,buffer,cont,0,(struct sockaddr *) &client,client_address_size); 
     printf("\n\nPacket sent\n"); 
    } 

    sendto(create_socket,"*",1,0,(struct sockaddr *) &client,client_address_size); 

    printf("Request Completed\n"); 
    return close(create_socket); 
} 

client.c:

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

int main() 
{ 
    int create_socket,cont,res; 
    char *arg="127.0.0.1"; 

    int bufsize = 1024; 
    int server_address_size=0; 
    char *buffer = malloc(10); 
    char fname[256]; 
    struct sockaddr_in address; 
    int serv_addr_size = sizeof(address); 

    if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) > 0) 
     printf("The Socket was created\n"); 

    address.sin_family = AF_INET; 
    address.sin_port = htons(15000); 
    address.sin_addr.s_addr=inet_addr(arg); 

    if (connect(create_socket,(struct sockaddr *) &address,sizeof(address)) == 0) 
     printf("The connection was accepted with the server %s...\n",arg); 

    printf("Enter The Filename to Request : "); 
    scanf("%s",fname); 
    res=sendto(create_socket, fname, sizeof(fname), 0,(struct sockaddr *) &address,sizeof(address)); 
    if(res<0) 
    { 
     printf("\n\nSendto falied...\n"); 
     exit(0); 
    } 
    printf("Request Accepted... Receiving File...\n\n"); 

    server_address_size=sizeof(address); 

    printf("The contents of file are...\n\n"); 

    while((cont=recvfrom(create_socket, buffer, 10, 0,(struct sockaddr *) &address,&serv_addr_size))>0) 
    { 
     if(buffer[cont-1]=='*') 
      break; 
     write(1, buffer, cont); 

    } 

    printf("\nEOF\n"); 
    return close(create_socket); 
} 

Выше код работает нормально, когда он запускается в той же системе. Скажите, пожалуйста, какие изменения необходимо выполнить для запуска вышеуказанного кода на разных машинах. Заранее спасибо.

+0

У вас есть брандмауэр в любой из систем или между установленными системами? вы можете использовать tcpdump или wirehark, чтобы узнать, есть ли какие-либо пакеты, отправленные с клиента на сервер, и наоборот. – dwalter

ответ

2

Вы пытались сменить char *arg="127.0.0.1"; на IP-адрес серверов? IP-адрес 10.60.5.945, упомянутый в вашем вопросе, не является допустимым IP-адресом.

Еще лучше было бы взять IP (или даже имя хоста, которое вы разрешите) из argv [1].

пс. Вы можете видеть действительные адреса IPv4 в вашем ящике Linux, набрав: ip -4 a l глобальная область

Смежные вопросы