2014-03-04 1 views
0

나는 정보를 서버로 보내고 서버 터미널 창에 인쇄되는 linux의 posix 소켓 API를 사용하여 클라이언트 응용 프로그램을 작성했습니다 . 서버가 클라이언트와 동일한 시스템에 있고 클라이언트가 루프백 또는 자체 IP 주소로 보내는 경우 모두 양호합니다. 그러나 서버가 다른 시스템에서 실행중인 경우 sendto는 "잘못된 인수"오류를 반환합니다. 내가 크게 응용 프로그램이 다른 컴퓨터로 전송하지 않습니다 이유에 대한 정보를 부탁드립니다'sendto()'함수는 다른 컴퓨터의 응용 프로그램에 데이터를 보내지 않습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include "utils.h" // for 'errexit()' 


#define PEER_PORT 54321 
#define BUFFSIZE 100 
#define local_net_ip "192.168.0.10" 

int main(int argc, char *argv[]) 
{ 

    int clientfd; 

    clientfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if(clientfd == -1) 
    errexit("socket()"); 

    struct sockaddr_in servaddr; 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(PEER_PORT); 
    if(inet_pton(AF_INET, local_net_ip, (void *) &(servaddr.sin_addr)) == -1) 
    errexit("inet_pton()"); 

    char addrStr[ INET_ADDRSTRLEN ]; 
    inet_ntop(servaddr.sin_family, &(servaddr.sin_addr), addrStr, INET_ADDRSTRLEN); 
    printf("Server IPv4 addr: [ %s ]\n", addrStr); 

    char buff[ BUFFSIZE ]; 
    int writebytes; 
    for(;;) { 

    printf("Enter text: "); 
    fgets(buff, BUFFSIZE, stdin); 

    writebytes = sendto(clientfd, buff, BUFFSIZE, 0, (struct sockaddr *) &servaddr,   sizeof(struct sockaddr_in)); 
    if(writebytes == -1) 
     errexit("sendto()"); 

    } 


    exit(EXIT_SUCCESS); 

} 

:

다음은 클라이언트 응용 프로그램 코드입니다! 미리 감사드립니다 !!

+0

방화벽 문제 ?? –

+0

방화벽으로 인해 sendto()가 실패 할 것이라고 생각하지 않습니다. (패킷이받는 컴퓨터에 도착하지 않을 수도 있음) –

+0

해당 컴퓨터에서 192.168.0.10으로 ping 할 수 있는지 확인 했습니까? 아마도 컴퓨터가 192.168.0. * 네트워크에 설치되지 않았습니까? –

답변

1

clientfd = socket (AF_INET, SOCK_DGRAM, 0);

예를 들어 프로토콜 0으로 소켓을 생성하고 있습니다. IP. 하지만 나중에 IP 및 포트를 대상으로 사용합니다. 여기에서 UDP 소켓을 사용하고 싶었을 것입니다 (proto 17).

관련 문제