c - Unix 中的套接字通信是如何工作的?有没有特殊的分隔符?什么是 '\r' ?

标签 c linux sockets unix

我的问题出现是因为我在 Linux 系统中使用 C 和带选择的套接字开发一个小型服务器。服务器一次接收一个字符。

例如:如果客户端输入“hi”然后按回车键,服务器将收到 h,然后是 i,最后是 '\n'。

我听说过'\r',但除了它是什么,但找不到它发送的时间之外,我找不到任何关于它的相关信息。

问题是:如果我想根据字符串的值执行操作,我是否应该将数据缓冲到“\n”,然后检查它包含的内容?还是每次收到字符时我都应该寻找“\r”?

最佳答案

取决于通过套接字发送的内容。 socket 不在乎。服务器使用什么协议(protocol)? 这就是的问题。它是否使用 gets() 读取行?从文件?您的客户必须了解所使用的协议(protocol)(协议(protocol))。

您可以使用像 wireshark 这样的数据包嗅探器以其他方式“嗅探线路”以查看从客户端发送的内容。或者只使用如下所示的 read() 并读取固定数量并显示您收到的内容的 ASCII 数值,直到您确定要用来划分内容的行终止符或定界符。

'\r' = 回车 (ASCII 0x0d)
'\n' = 换行符 (ASCII 0x0a)

套接字程序没什么大不了的。

下面是一个使用从 socketpair() 系统调用中检索到的一对套接字在单个程序中通过套接字进行通信的示例。

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>

#define DATA1 "In Xanadu, did Kublai Khan . . ."
#define DATA2 "A stately pleasure dome decree . . ."

/*
 * This program creates a pair of connected sockets, then forks and
 * communicates over them.  This is very similar to communication with pipes;
 * however, socketpairs are two-way communications objects. Therefore,
 * this program can send messages in both directions.
 */
main()
{
    int sockets[2], child;
    char buf[1024];

    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) {
        perror("opening stream socket pair");
        exit(1);
    }
    if ((child = fork()) == -1)
        perror("fork");
    else if (child) {   /* This is the parent. */
        close(sockets[0]);
        if (read(sockets[1], buf, 1024, 0) < 0)
            perror("reading stream message");
        printf("-->%s\n", buf);
        if (write(sockets[1], DATA2, sizeof(DATA2)) < 0)
            perror("writing stream message");
        close(sockets[1]);
    } else {        /* This is the child. */
        close(sockets[1]);
        if (write(sockets[0], DATA1, sizeof(DATA1)) < 0)
            perror("writing stream message");
        if (read(sockets[0], buf, 1024, 0) < 0)
            perror("reading stream message");
        printf("-->%s\n", buf);
        close(sockets[0]);
    }
}

关于c - Unix 中的套接字通信是如何工作的?有没有特殊的分隔符?什么是 '\r' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29442327/

相关文章:

c - 如何解决 printf 中的 %d 输出显示 num1、num2 和 sum 的 ascii 值,而不是它们分配的值

linux - 移动目录排除文件

linux - 知道目录是否为空的权限

python - 如何知道远程tcp设备是否关机

c - 错误 : expected ‘)’ before ‘;’ token

c - 下载控制板软件模拟器

c - 输入 1,000,000 个数字后程序无法运行?

linux - 赋予非 root 用户进程能力以改变其友好性

c - C套接字中需要多个连接

c - 为什么在 C 中绑定(bind)套接字时需要地址长度参数?