LinuxC下TCP循环read实例分享 (linuxc下tcp循环read()实例)
TCP通信是现代计算机通信中最常用的方式之一,而在实际应用中,需要对TCP数据进行循环读取才能实现对完整数据的处理。为此,本文将分享一种基于LinuxC的TCP循环read实例,以供读者参考。
一、TCP通信概述
TCP(Tranission Control Protocol,传输控制协议),是一种基于连接的可靠的传输层通信协议。在TCP通信中,发送方将要发送的数据分成合适的大小,并以数据包的形式发送给接收方,接收方则通过确认回复确保数据的正确传输。
二、LinuxC下的TCP编程
Linux下的TCP编程通常使用socket进行实现,socket是一种用于在应用程序之间传递数据的软件结构,其提供了一个标准的接口和套接字(socket)接口。在使用socket进行TCP编程时,需要实现的基本步骤包括:创建socket、绑定地址、监听连接、接收连接、发送数据等。
三、TCP循环read实现原理
在进行TCP通信时,接收方需要对数据进行循环读取才能实现对完整数据的处理。具体实现过程为:首先读取数据头信息,获取数据总长度;然后根据总长度循环读取数据,并将每次读取到的数据进行拼接;最后处理完整个数据包。
四、TCP循环read实现示例代码
本文提供一份基于LinuxC的TCP循环read实现示例代码,其中实现了以上所述的循环读取数据的过程。代码如下:
“`C
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 1024
#define PORT 6000
static int g_stop = 0;
void sig_stop(int signo) {
g_stop = 1;
signal(signo, sig_stop);
printf(“stop signal\n”);
return;
}
int mn(int argc ,char **argv) {
int sockfd,new_sockfd,recv_len;
char recv_data[BUFFER_SIZE];
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
signal(SIGINT, sig_stop);
/*——————————- 1.create socket ——————————-*/
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror(“socket fled!”);
exit(1);
}
/*——————————- 2.bind socket ——————————-*/
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
int opt = 1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const char *)&opt,sizeof(int));
/*——————————- 3.listen on port ——————————-*/
if ((bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1))
{
perror(“bind error”);
exit(1);
}
if(listen(sockfd,100) == -1)
{
perror(“listen error”);
exit(1);
}
printf(“TCP server wting for client on port %d\r\n”, PORT);
while(!g_stop) {
socklen_t sin_size = sizeof(struct sockaddr_in);
/*——————————- 4.accept client connection ——————————-*/
if ((new_sockfd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror(“accept error”);
exit(1);
}
printf(“server: got connection from %s, port %d\n”,inet_ntoa(remote_addr.sin_addr),ntohs(remote_addr.sin_port));
/*——————————- 5.wt for recv data ——————————-*/
unsigned short data_len, recv_len = 0;
bzero(recv_data, BUFFER_SIZE);
while(recv_len
recv_len += recv(new_sockfd, recv_data + recv_len, sizeof(unsigned short) – recv_len, 0);
}
memcpy(&data_len, recv_data, sizeof(unsigned short));
printf(“recv data_len: %d\n”, data_len);
while(recv_len
recv_len += recv(new_sockfd, recv_data + recv_len, data_len – recv_len, 0);
}
printf(“recv data: %s\n”, recv_data);
/*——————————- 6.close connection ——————————-*/
close(new_sockfd);
}
/*——————————- 7.close socket ——————————-*/
close(sockfd);
return (0);
}
“`
代码思路为:首先创建socket,然后绑定地址并监听连接;之后进入循环,接收客户端连接,循环读取客户端发送的数据;最后关闭连接和socket。
五、