LwIP socket 기반 TCP 서버
1971 단어 LwIP
1. 흐름 기반 socket 만들기
2. 로컬 서버 IP 주소 및 포트 번호 설정
3. 생성된 socket 및 로컬 IP 주소 및 포트 정보 바인딩
4. 이 socket 감청 (listen)
5. 이 socket 수락 (accept)
6. 데이터 전송, 수신
상기 몇 가지 절차를 거친 후에 간단한 서버가 만들어졌다. TCP 서버는 주로 감청과 수락 두 가지 절차가 많고 연결 절차가 적다. 그 원본 코드는 다음과 같다.
#include
#include
#include
#define PORT 50000
RAW_U8 data_buffer[100];
static void tcp_server_thread(void *p_arg)
{
struct sockaddr_in server_addr;
struct sockaddr_in conn_addr;
int sock_fd; /* server socked */
int sock_conn; /* request socked */
socklen_t addr_len;
int err;
int length;
int count = 0;
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) {
Uart_Printf("failed to create sock_fd!
");
RAW_ASSERT(0);
}
raw_memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
err = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (err < 0) {
RAW_ASSERT(0);
}
err = listen(sock_fd, 1);
if (err < 0) {
RAW_ASSERT(0);
}
addr_len = sizeof(struct sockaddr_in);
Uart_Printf("before accept!
");
sock_conn = accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
Uart_Printf("after accept!
");
while (1) {
raw_memset(data_buffer, 0, sizeof(data_buffer));
length = recv(sock_conn, (unsigned int *)data_buffer, 20, 0);
Uart_Printf("length received %d
", length);
Uart_Printf("received string: %s
", data_buffer);
Uart_Printf("received count: %d
", count);
send(sock_conn, "good", 5, 0);
}
}
void tcp_server_init(void)
{
sys_thread_new("tcp_server_thread", tcp_server_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO - 1);
}