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

时间:2015-04-04 03:13:16

标签: c linux sockets unix

我的问题出现了,因为我正在使用C和套接字在Linux系统中使用select开发一个小型服务器。服务器当时收到一个字符。

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

我听说过' \ r'但是我找不到任何相关的信息比它发送的更多,但不能发送它。

问题是:如果我想根据字符串的值执行操作,我应该将数据缓冲到' \ n'然后检查它包含什么?或者我应该寻找一个' \ r'每次收到一个角色?

1 个答案:

答案 0 :(得分:3)

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

你可以使用像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]);
    }
}