树莓派tcp服务器性能,【树莓派4B测评】+TCP服务器和HTTP通信

【树莓派4B测评】+TCP服务器和HTTP通信

[复制链接]

今天使用树莓派搭建一个TCP服务器,使用HTTP通信,话不多说,直接开始;

首先检查树莓派是都安装curl库;

输入命令:curl www.baidu.com

a26d678767e8b431ecd7a25f1936bdc5.gif

image.png (44.48 KB, 下载次数: 0)

2020-8-31 19:22 上传

可以看到是有curl库的,如果没有也可以自己装一下;

然后就是建立TCP服务,通过socket通信完成;具体过程:建立socket->绑定端口和IP->Listen->等待客户端连接->断开连接;如果是客户端则是:建立socket->绑定端口和IP->连接服务器->断开连接;

代码如下:

int main(int argc,char **argv)

{

const int port = 9689;//listen port

int listenfd=Socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in serverAddr;

serverAddr.sin_family=AF_INET;

serverAddr.sin_addr.s_addr=INADDR_ANY;

serverAddr.sin_port=htons(port);

Bind(listenfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));

Listen(listenfd,5);

while(true)

{

handleAccept(listenfd);

}

}

int Socket(int family , int type,int protocol)

{

int n;

if ( (n = socket(family, type, protocol)) < 0)

{

printf("socket error\r\n");

return -1;

}

return(n);

}

void

Bind(int fd, const struct sockaddr *sa, socklen_t salen)

{

if (bind(fd, sa, salen) < 0)

{

printf("bind error\r\n");

exit(-1);

}

}

void

Listen(int fd, int backlog)

{

char *ptr;

/*4can override 2nd argument with environment variable */

if ( (ptr = getenv("LISTENQ")) != NULL)

backlog = atoi(ptr);

if (listen(fd, backlog) < 0)

{

printf("listen error\r\n");

return ;

}

}

int

Accept(int fd, struct sockaddr *sa, socklen_t *salenptr)

{

int n;

again:

if ( (n = accept(fd, sa, salenptr)) < 0) {

#ifdef EPROTO

if (errno == EPROTO || errno == ECONNABORTED)

#else

if (errno == ECONNABORTED)

#endif

goto again;

else

{

printf("accept error\r\n");

return -1;

}

}

return(n);

}

void handleAccept(int listenfd)

{

sockaddr_in clientAddr;

socklen_t clientLen=sizeof(clientAddr);

int connfd=Accept(listenfd,(sockaddr *)&clientAddr,&clientLen);

handleHttp(connfd);

close(connfd);

}

我这里做了一个简单的http例程,就是访问连接服务器后,回复一个网页,代码如下:

void handleHttp(int connfd)

{

if(getRequest(connfd)<0)

{

perror("http request get error");

exit(-1);

}

}

int getRequest(int socket)

{

int msgLen=0;

char send_data[BUFFER_SIZE];

char buffer[BUFFER_SIZE];

memset (buffer,'\0', BUFFER_SIZE);

if ((msgLen = recv(socket, buffer, BUFFER_SIZE, 0)) == -1)

{

printf("Error handling incoming request");

return -1;

}

else

{

printf("recv:\n%s\n",buffer);

}

memset (send_data,'\0', BUFFER_SIZE);

//create_objects(send_data);

stringstream ss;

ss<

string method;

ss>>method;

string uri;

ss>>uri;

string version;

ss>>version;

//

string contentType("text/html");

string content("

simple httpserver

hello eeworld

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值