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。

五、


数据运维技术 » LinuxC下TCP循环read实例分享 (linuxc下tcp循环read()实例)