我正在尝试这个多线程代码来理解。任何人都可以帮助我理解"打印消息"部分。我在这里发布代码
#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);
从缓冲区读取??
答案 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()
分配的缓冲区而不进行初始化。