STM32F7 LWIP socket 创建TCP server
- typedef struct {
- struct sockaddr_in client_info;
- s32 id;
- u16 port;
- } client_info_s;
- void client_proc(void* parm) {
- client_info_s* info = (client_info_s*)parm;
- u8* rec_data = sys_malloc(1500);
- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
- while(1) {
- s32 ret = read(info->id, rec_data, 1500);
- if(ret > 0) {
- WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
- ret = write(info->id, rec_data, ret);
- if(ret < 0) {
- WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
- sys_free(rec_data);
- osThreadExit();
- }
- } else if(ret < 0 ) {
- WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id,
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
- close(info->id);
- sys_free(rec_data);
- osThreadExit();
- }
- }
- }
- typedef struct {
- u16 port;
- u8 cnt;
- u8 rvd;
- } server_parm_s;
- void create_tcp_task(void* pram) {
- server_parm_s parm;
- memcpy(&parm, &pram, 4);
- WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
- int listenfd, connfd;
- struct sockaddr_in servaddr;
- struct sockaddr client_addr;
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
- {
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
- while(1);
- }
- memset(&servaddr, 0, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(parm.port);
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
- {
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
- while(1);
- }
- if( listen(listenfd, parm.cnt) == -1)
- {
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
- }
- while(1)
- {
- socklen_t socklen = sizeof(client_addr);
- memset(&client_addr, 0, sizeof(client_addr));
- if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
- {
- WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
- continue;
- }
- client_info_s* client = sys_malloc(sizeof(client_info_s));
- if(client) {
- client->client_info = *(struct sockaddr_in*)&client_addr;
- client->id = connfd;
- client->port = parm.port;
- osThreadNew(client_proc,(void*)client, NULL);
- }
- }
- }
- void create_tcp_server(u16 port, u16 cnt){
- server_parm_s parm;
- parm.port = port;
- parm.cnt = cnt;
- u32* ptr =(u32*)&parm;
- osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
- }
复制代码
非阻塞方式:
- void trace_task(void *argument) {
- const TickType_t xBlockTime = pdMS_TO_TICKS(50);
- u8* read_buf = malloc(128);
- WDBG("TCP SEVER port:%d", 1234);
- int listenfd = -1;
- int connfd = -1;
- struct sockaddr_in servaddr;
- struct sockaddr_in client_addr;
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
- {
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
- while(1);
- }
- memset(&servaddr, 0, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(1234);
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
- {
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
- while(1);
- }
- if( listen(listenfd, 3) == -1)
- {
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
- }
- {
- DWORD nMode = 1;
- ioctlsocket( listenfd, FIONBIO, &nMode );
- }
- fd_set fdRead;
- fd_set fd_err;
- struct timeval tv;
- socklen_t socklen = sizeof(client_addr);
- memset(&client_addr, 0, sizeof(client_addr));
- while(1) {
- FD_ZERO(&fdRead);
- FD_ZERO(&fd_err);
- FD_SET( listenfd, &fdRead);
- u8 cnt = 2;
- if(connfd != -1) {
- cnt++;
- FD_SET(connfd, &fdRead);
- FD_SET(connfd, &fd_err);
- }
- if(connfd != -1) {
- u32 rec_size = xStreamBufferReceive( g_trace_handle,
- ( void * ) read_buf, 128, xBlockTime);
- if(rec_size) {
- s32 ret = send(connfd, read_buf, rec_size, 0);
- if(ret < 0) {
- closesocket(connfd);
- connfd = -1;
- continue;
- }
- }
- }
- tv.tv_sec = 0;
- tv.tv_usec = 20000;
- s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
- if(ret == 0) {
- continue;
- }
- if(ret > 0) {
- if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
- connfd = -1;
- continue;
- }
- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
- ret = recv(connfd, read_buf, 128, 0);
- if(ret < 0) {
- closesocket(connfd);
- connfd = -1;
- continue;
- } else if(ret >0) {
- WDBG("rec size:%d", ret);
- }
- }
- if(FD_ISSET(listenfd, &fdRead)) {
- s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
- // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
- if(connfd == -1) {
- connfd = temp;
- } else {
- closesocket(temp);
- }
- }
- }
- }
- #endif
- }
复制代码
|