#include "sock_api/sock_api.h"
void tcp_server_test(void *arg)
{
struct sockaddr_in sin; /* bind socket address */
socklen_t sinlen; /* length of address */
fd_set readfds;
fd_set errofds;
struct timeval timeo;
int ret;
int fd;
struct sockaddr_in addr;
int reuse;
//申请一个套接字
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0){
printf("\n >>>>>> socket error\n");
return;
}
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse, sizeof(int)) < 0)
{
printf("\n >>>>>> setsockopt SO_REUSEADDR error\n");
return;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.1.101");
addr.sin_port = htons(5200);
/* 连接到服务端 */
if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
printf("\n >>>>>> connect error\n");
return;
}
//获取当前描述符的flag
int opts;
opts=fcntl(fd, F_GETFL, 0);
if(opts<0)
{
printf("\n >>>>>> F_GETFL error\n");
return;
}
//设置当前描述符为非阻塞方式
opts = opts | O_NONBLOCK;
if(fcntl(fd,F_SETFL,opts)<0)
{
printf("\n >>>>>> F_SETFL error\n");
return;
}
while(1){
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
FD_ZERO(&errofds);
FD_SET(fd, &errofds);
timeo.tv_sec = 1;
timeo.tv_usec = 1000 * 10;//设置超时时间
ret = select(fd + 1, &readfds, (fd_set *)0, &errofds, &timeo );
if (ret == 0){//返回值等于0表示超时
continue;
}
else if (ret < 0){//返回值小于于0表示出错
printf("\n >>>>>> ret = %d\n",ret);
break;
}
if (FD_ISSET(fd, &errofds))
{
printf("\n >>>>>> exit ok!\n");
break;
}
sinlen = sizeof(sin);
if (FD_ISSET(fd, &readfds))
{
char buf[128];
ret = recv(fd,buf,sizeof(buf),0);
if(ret <= 0){
printf("\n >>>>>> exit ok!\n");
break;
}
put_buf(buf,ret);
}
}
}
int sock_test(void)
{
thread_fork("tcp_server_test", 18, 0x2E00, 64, 0, tcp_server_test, NULL);
return 0;
}
lwip 基于select方式实现的tcp简易客户端
最新推荐文章于 2024-05-04 11:01:55 发布