无法在C中使用位于不同网络上的服务器进程进行连接

时间:2015-04-13 09:46:42

标签: sockets unix

我正在尝试使用C套接字编程在位于不同网络上的两个系统之间发送消息。 但是当connect()系统调用启动时,它返回-1,因此我无法连接到服务器。 如何连接到位于不同网络或不同计算机上的远程服务器。当我在本地计算机上使用客户端和服务器时,相同的程序正在运行。

**Client code ----->**

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


    int sockfd,portno,n;

    char buffer[256];


    struct sockaddr_in serv_addr;
    struct hostent *server;

    if (argc<3)
        error("error port number not provided");

    portno = atoi(argv[2]);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd<0)
        error("error while creating socket ");

    server =(struct hostent *)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 while connecting..");
    while(strncpy(buffer,"bye",3)!=0){
        bzero(buffer,256);
        printf("\nYou:");
        fgets(buffer,255,stdin);

        //n= write(sockfd,buffer,strlen(buffer));
    n=send(sockfd,(char*)&buffer,strlen(buffer),0);
        if(n<0)


printf("message not delivered\n");
    bzero(buffer,256);
    //n= read(sockfd,buffer,255);
    n= recv(sockfd,buffer,255,0);
    printf("\nfrd:%s",buffer);
    }

    close(sockfd);
    }

**Server code -->**

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

    int sockfd,listenfd,portno,clilen,n;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;

    if (argc<2)
        error("error port number not provided");

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd<0)
        error("error while creating 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 while binding socket");
    listen(sockfd`enter code here`,5);
    clilen = sizeof(cli_addr);

            if ((listenfd = accept(sockfd, (struct sockaddr*)&cli_addr,&clilen))<0)
            error("error while initializing listening");
    printf("listening for connections..");
while(strncmp(buffer,"bye",3)!=0){
        bzero(buffer,256);
//n= read(listenfd,buffer,255);
        n= recv(listenfd,buffer,255,0);
        if(n<0)
            error("no message");
        printf("\nfrd:%s",buffer);
        printf("\nyou:");
        fgets(buffer,255,stdin);
//n= write(listenfd,buffer,sizeof buffer);
        n=send(listenfd,(char*)&buffer,strlen(buffer),0);
        if(n<0)
            printf("message not sent");

    }
close(sockfd);
}

1 个答案:

答案 0 :(得分:0)

所有客户端代码都与服务器中的代码相同。

server =(struct hostent *)gethostbyname(argv[1]);
if(server == NULL){
    fprintf(stderr,"ERROR, no such host\n");
    exit(0);
}

argv 1包含互联网上主机的名称,例如hsembedded.blogspot.in;)  功能:      struct hostent * gethostbyname(char * name) 将此类名称作为参数,并返回指向包含有关该主机的信息的hostent的指针。字段char * h_addr包含IP地址。如果此结构为NULL,则系统无法找到具有此名称的主机。 此功能的工作机制很复杂,通常涉及查询全国各地的大型数据库。

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);

此代码设置serv_addr中的字段。其中大部分与服务器中的相同。但是,因为字段服务器 - &gt; h_addr是一个字符串,我们使用以下函数: void bcopy(char * s1,char * s2,int length) 它将长度字节从s1复制到s2。

错误实际上是由于客户端代码中缺少#include<netdb.h>