【问题标题】:Client server chat application in cc中的客户端服务器聊天应用程序
【发布时间】:2017-03-10 21:34:38
【问题描述】:

我正在一个客户端和一个服务器之间通过建立它们之间的套接字连接来做这个简单的聊天应用程序。我能够在同一台计算机上的两个不同终端上运行客户端和服务器。 现在,如何在两台不同的计算机上运行客户端和服务器? 我尝试这样做,我提供服务器机器的 IP 地址来代替服务器程序中的本地主机“127.0.0.1”。没用。

谁能告诉我如何实现这个。另外,如何动态传递ip地址和端口号?

TCP 客户端

#include<sys/socket.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<stdlib.h>

int main()
{
    char buf[100];
    int k;
    int sock_desc;
    struct sockaddr_in client;
    memset(&client,0,sizeof(client));
    sock_desc=socket(AF_INET,SOCK_STREAM,0);

    if(sock_desc==-1)
    {
        printf("Error in socket creation");
        exit(1);
    }

    client.sin_family=AF_INET;
    client.sin_addr.s_addr=INADDR_ANY;
    client.sin_port=3002;

    k=connect(sock_desc,(struct sockaddr*)&client,sizeof(client));
    if(k==-1)
    {
        printf("Error in connecting to server");
        exit(1);
    }

    while(1)
    {
        printf("\nEnter data to be send to server: ");
        fgets(buf,100,stdin);
        if(strncmp(buf,"end",3)==0)
            break;

        k=send(sock_desc,buf,100,0);
        if(k==-1)
        {
            printf("Error in sending");
            exit(1);
        }

        k=recv(sock_desc,buf,100,0);
        if(k==-1)
        {
            printf("Error in receiving");
            exit(1);
        }

        printf("Message got from server is : %s",buf);
    }
    close(sock_desc);
    exit(0);
    return 0;
}

TCP 服务器

#include<sys/socket.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<stdlib.h>
int main()
{
    char buf[100];
    int k;
    socklen_t len;
    int sock_desc,temp_sock_desc;
    struct sockaddr_in server,client;

    memset(&server,0,sizeof(server));
    memset(&client,0,sizeof(client));

    sock_desc=socket(AF_INET,SOCK_STREAM,0);
    if(sock_desc==-1)
    {
        printf("Error in socket creation");
        exit(1);
    }

    server.sin_family=AF_INET;
    server.sin_addr.s_addr=inet_addr("127.0.0.1");
    server.sin_port=3002;

    k=bind(sock_desc,(struct sockaddr*)&server,sizeof(server));
    if(k==-1)
    {
        printf("Error in binding");
        exit(1);
    }

    k=listen(sock_desc,20);
    if(k==-1)
    {
        printf("Error in listening");
        exit(1);
    }

    len=sizeof(client);//VERY IMPORTANT
    temp_sock_desc=accept(sock_desc,(struct sockaddr*)&client,&len);
    if(temp_sock_desc==-1)
    {
        printf("Error in temporary socket creation");
        exit(1);
    }

    while(1)
    {
        k=recv(temp_sock_desc,buf,100,0);
        if(k==-1)
        {
            printf("Error in receiving");
            exit(1);
        }

        printf("Message got from client is : %s",buf);
        printf("\nEnter data to be send to client: ");

        fgets(buf,100,stdin);
        if(strncmp(buf,"end",3)==0)
            break;

        k=send(temp_sock_desc,buf,100,0);
        if(k==-1)
        {
            printf("Error in sending");
            exit(1);
        }
    }
    close(temp_sock_desc);

    exit(0);
    return 0;
}

【问题讨论】:

  • 您可以将 IP 和端口作为参数传递给 main。该程序应将 IP 和端口作为命令行参数。
  • 请正确缩进你的代码,这样会更易读。
  • 您可以测试telnet或任何其他网络程序是否在两台计算机之间工作。某些防火墙可能会阻止两台计算机之间的通信。

标签: c linux sockets tcp


【解决方案1】:

您的客户端 sockaddr_in 和服务器 sockaddr_in 是相反的。 客户端 sockaddr_in 结构应该是:

client.sin_family=AF_INET;
client.sin_addr.s_addr=inet_addr("add server ip here");
client.sin_port=3002;

而服务器的 sockaddr_in 结构应该是:

server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=3002;

现在您的服务器仅在环回上绑定,而您的客户端连接到 INADDR_ANY。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2011-06-18
    • 2018-10-04
    相关资源
    最近更新 更多