我正在尝试这个多线程代码来理解。任何人都可以帮助我理解"打印消息"部分。我在这里发布代码

时间:2016-02-29 01:47:32

标签: c multithreading sockets

我正在尝试这个多线程代码来理解。任何人都可以帮助我理解"打印消息"部分。我在这里发布代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <sys/socket.h>
    #include <linux/in.h>
    #include <unistd.h>

    typedef struct
    {
        int sock;
        struct sockaddr address;
        int addr_len;
    } connection_t;

    void * process(void * ptr)
    {
        char * buffer;
        int len;
        connection_t * conn;
        long addr = 0;

        if (!ptr) pthread_exit(0); 
        conn = (connection_t *)ptr;


        read(conn->sock, &len, sizeof(int));
        if (len > 0)
        {
            addr = (long)((struct sockaddr_in *)&conn->address)->sin_addr.s_addr;
            buffer = (char *)malloc((len+1)*sizeof(char));
            buffer[len] = 0;

            read(conn->sock, buffer, len);

            /* print message */
            printf("%d.%d.%d.%d: %s\n",
                (int)((addr      ) & 0xff),
                (int)((addr >>  8) & 0xff),
                (int)((addr >> 16) & 0xff),
                (int)((addr >> 24) & 0xff),
                buffer);
            free(buffer);
        }


        close(conn->sock);
        free(conn);
        pthread_exit(0);
    }

    int main(int argc, char ** argv)
    {
        ...
        ...
        ...

      return 0;
        }

我知道我们正在尝试从缓冲区打印数据,但所有这些移位运算符和&#39; &安培; 0xff的&#39;部分帮助? :

printf("%d.%d.%d.%d: %s\n",
                (int)((addr      ) & 0xff),
                (int)((addr >>  8) & 0xff),
                (int)((addr >> 16) & 0xff),
                (int)((addr >> 24) & 0xff),
                buffer);

我们不能简单地使用这样的printf语句:

printf("Here is the message: %s\n",buffer);

从缓冲区读取??

1 个答案:

答案 0 :(得分:0)

它们正在分裂addr,它预计是32位长,但并不总是,每个八位字节。

printf("%d.%d.%d.%d: %s\n",
                (int)((addr      ) & 0xff), /* the least octet */
                (int)((addr >>  8) & 0xff), /* the second least octet */
                (int)((addr >> 16) & 0xff), /* the second most octet */
                (int)((addr >> 24) & 0xff), /* the most octet */
                buffer); /* what is received */

您可以使用

printf("Here is the message: %s\n",buffer);

如果您不想知道数据包的发送位置。

请注意,您应使用calloc代替malloc来初始化缓冲区为零或更改

read(conn->sock, buffer, len);

{
    ssize_t readlen = read(conn->sock, buffer, len);
    if (readlen < 0) readlen = 0;
    buffer[readlen] = '\0';
}
在将buffer传递给printf()之前

。否则,您可以调用未定义的行为以使用通过malloc()分配的缓冲区而不进行初始化。