c 中的客户端服务器聊天应用程序

标签 c linux sockets tcp

我正在一个客户端和服务器之间通过建立套接字连接来实现这个简单的聊天应用程序。我能够在同一台计算机上的两个不同终端上运行客户端和服务器。 现在,如何在两台不同的计算机上运行客户端和服务器? 我尝试这样做我给服务器机器的 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;
}

最佳答案

您的客户端 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;

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

关于c 中的客户端服务器聊天应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297504/

相关文章:

regex - SED 中的多行替换

c - 如何正确使用 SO_KEEPALIVE 选项来检测另一端的客户端是否已关闭?

java - 在建立连接之前,accept() 方法到底是如何被阻塞的?

java - 如何在保持输入流打开以获得结果的同时关闭 Java 套接字输出流?

c - 为所有使用的函数实例添加新参数

c++ - 包裹一个数字?

linux - iptables 的 FTP 问题

c++ - 为什么第一次调用 readline() 会减慢对 fnmatch() 的所有后续调用?

c - 在 C 中越界访问数组不会产生运行时错误

android - android内核编译错误