linux编程中,关于socket的一段代码,不太理解,请问
/*处理客户端的通信*/intprocess_client(intindex){intbyte;intsock=client[index].sockfd;char*buf...
/* 处理客户端的通信 */
int process_client(int index)
{
int byte;
int sock = client[index].sockfd;
char *buf = client[index].buf;
int tail = client[index].tail;
/* 接收数据 */
byte = recv(sock, buf+tail, BUF_SIZE-tail, MSG_DONTWAIT);
if (byte == 0 || (byte < 0 && errno != EINTR)) {
printf("%s:%d error or disconnected, socket is closing...\n",
client[index].ip, client[index].port);
close(sock);
client[index].sockfd = -1;
client[index].tail = 0;
return -1;
}
/* 移动缓冲区尾部指针 */
tail += byte;
if (tail > sizeof(int)) { /* 如果收到的数据超出一个整数的大小 */
/* 解析这个整数,它表示字符串的长度 */
int len = ntohl(*(int *)buf);
if (tail-sizeof(int) == len) { /* 字符串已接收完全 */
/* 显示字符串 */
buf[tail] = '\0';
printf("%s:%d > %s\n",
client[index].ip, client[index].port, buf+sizeof(int));
/* 回送 OK */
send_str(sock, "OK");
/* 移动缓冲区指针到开始 */
tail = 0;
} else if (tail == BUF_SIZE) { /* 字符串接收未完全但缓冲区已满 */
/* 显示字符串 */
buf[tail] = '\0';
printf("%s:%d > %s\n",
client[index].ip, client[index].port, buf+sizeof(int));
/* 修改缓冲区中的字符串长度,并移动缓冲区指针 */
/* 将字符串的剩余部分作为下一个字符串处理 */
/* 因为不允许阻塞,所以不能再用 eat_byte 消耗掉剩余字符 */
*(int *)buf = htonl(len-BUF_SIZE+sizeof(int));
tail = sizeof(int);
}
}
client[index].tail = tail;
return 0;
} 展开
int process_client(int index)
{
int byte;
int sock = client[index].sockfd;
char *buf = client[index].buf;
int tail = client[index].tail;
/* 接收数据 */
byte = recv(sock, buf+tail, BUF_SIZE-tail, MSG_DONTWAIT);
if (byte == 0 || (byte < 0 && errno != EINTR)) {
printf("%s:%d error or disconnected, socket is closing...\n",
client[index].ip, client[index].port);
close(sock);
client[index].sockfd = -1;
client[index].tail = 0;
return -1;
}
/* 移动缓冲区尾部指针 */
tail += byte;
if (tail > sizeof(int)) { /* 如果收到的数据超出一个整数的大小 */
/* 解析这个整数,它表示字符串的长度 */
int len = ntohl(*(int *)buf);
if (tail-sizeof(int) == len) { /* 字符串已接收完全 */
/* 显示字符串 */
buf[tail] = '\0';
printf("%s:%d > %s\n",
client[index].ip, client[index].port, buf+sizeof(int));
/* 回送 OK */
send_str(sock, "OK");
/* 移动缓冲区指针到开始 */
tail = 0;
} else if (tail == BUF_SIZE) { /* 字符串接收未完全但缓冲区已满 */
/* 显示字符串 */
buf[tail] = '\0';
printf("%s:%d > %s\n",
client[index].ip, client[index].port, buf+sizeof(int));
/* 修改缓冲区中的字符串长度,并移动缓冲区指针 */
/* 将字符串的剩余部分作为下一个字符串处理 */
/* 因为不允许阻塞,所以不能再用 eat_byte 消耗掉剩余字符 */
*(int *)buf = htonl(len-BUF_SIZE+sizeof(int));
tail = sizeof(int);
}
}
client[index].tail = tail;
return 0;
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询