C Socket 程序未打印所需的输出(无错误)

标签 c sockets networking server client

我似乎无法打印我在客户端中输入的内容。我已经编译了两者,没有任何错误。无法弄清楚为什么它没有打印所需的输出。

问。我的代码有什么问题?如何通过客户端在服务器中打印带有空格的字符串。

这是服务器的代码。

/* Server Side program */


    int sid,nid;
    struct sockaddr_in q;
    char x[100];

    int len=sizeof(struct sockaddr_in);

    sid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
    q.sin_family=PF_INET;
    q.sin_port=1600;
    q.sin_addr.s_addr=0;

    bind(sid,&q,len);

    listen(sid,20);

    while(1)
    {
            memset(x,0,sizeof(x));
            nid=accept(sid,&q,&len);
            read(nid,x,100);
            printf("%s\n",x);

    }

这是客户端的代码。

/*client side program*/


    int sid,status;
    struct sockaddr_in q;
    int len=sizeof(struct sockaddr_in);
    char x[100];

    sid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
            q.sin_family=PF_INET;                   
            q.sin_port=1600;                        
            q.sin_addr.s_addr=0;                  
    status=connect(sid,&q,len);
    if(status==-1)
    {
            printf("Connection failure");
            exit(0);
    }

    while(1)
    {
            printf("Enter string to send : ");
            scanf("%[^\n]s",x);
            write(sid,x,strlen(x));
            if(strcmp(x,"bye")==0)
                     break;

    }

最佳答案

您的代码存在各种问题。缺乏错误处理。 printf()scanf() 的使用不正确。资源泄漏。

尝试更多类似这样的事情:

服务器:

int main()
{
    int sid, nid;
    struct sockaddr_in q;
    char x[100];
    socklen_t qlen;
    ssize_t xlen;

    sid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sid < 0)
    {
        perror("socket failure");
        return -1;
    }

    q.sin_family = AF_INET;
    q.sin_port = htons(1600);
    q.sin_addr.s_addr = INADDR_ANY;

    if (bind(sid, &q, sizeof(q)) < 0)
    {
        perror("bind failure");
        return -1;
    }

    if (listen(sid, 20) < 0)
    {
        perror("listen failure");
        return -1;
    }

    while(1)
    {
        qlen = sizeof(q);
        nid = accept(sid, &q, &qlen);
        if (nid < 0)
        {
            perror("accept failure");
            return -1;
        }

        while ((xlen = read(nid, x, sizeof(x))) > 0)
        {
            printf("Received: '%.*s'\n", xlen, x);
        }

        if (xlen < 0)
            perror("read failure");
        else
            printf("client disconnected\n");

        close(nid);
    }

    return 0;
}

客户:

int main()
{
    int sid, xlen;
    struct sockaddr_in q;
    char x[100];

    sid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sid < 0)
    {
        perror("socket failure");
        return -1;
    }

    q.sin_family = AF_INET;                   
    q.sin_port = htons(1600);
    q.sin_addr.s_addr = inet_addr("server ip here"); // or INADDR_LOOPBACK (127.0.0.1)

    if (connect(sid, &q, sizeof(q)) < 0)
    {
        printf("connect failure");
        return -1;
    }

    while(1)
    {
        printf("Enter string to send : ");
        if (!fgets(x, sizeof(x), stdin))
            break;

        xlen = strlen(x);
        if ((xlen > 0) && (x[xlen-1] == '\n'))
        {
            x[xlen-1] = '\0';
            --xlen;
        }

        if (write(sid, x, xlen) < 0)
        {
            perror("write failure");
            break;
        }

        if (strcmp(x, "bye") == 0)
            break;
    }

    close(sid);

    return 0;
}

关于C Socket 程序未打印所需的输出(无错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50762216/

相关文章:

c++ - Boost Asio 不发送 UDP 广播数据包

c - 如何在共享内存中保存结构 C - Windows

c - SDL 库内存泄漏

c - 如何在C中的Excel工作表中创建另一行

java - 用 Java 将 PDF 文件发送到网络打印机

python - Python 中的 ICMP pinger 应用程序 - 错误 : operation not permitted?

c - 为什么 `int test {}`是C语言BNF中的函数定义

c - 用私钥加密,用公钥解密

c - C 中的套接字 : Proper way to close socket

java - 为什么我的套接字在 Android 上关闭?