xref: /nrf52832-nimble/rt-thread/examples/network/tcpsendpacket.c (revision 104654410c56c573564690304ae786df310c91fc)
1 #include <rtthread.h>
2 
3 #include <netdb.h>   /* Ϊ�˽�������������Ҫ����netdb.hͷ�ļ� */
4 #include <sys/socket.h> /* ʹ��BSD socket����Ҫ����socket.hͷ�ļ� */
5 
tcp_senddata(const char * url,int port,int length)6 void tcp_senddata(const char *url, int port, int length)
7 {
8     struct hostent *host;
9     int sock, err, result, timeout, index;
10     struct sockaddr_in server_addr;
11     rt_uint8_t *buffer_ptr;
12 
13     /* ͨ��������ڲ���url���host��ַ��������������������������� */
14     host = gethostbyname(url);
15     /* ����һ��socket��������SOCKET_STREAM��TCP���� */
16     if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
17     {
18         /* ����socketʧ�� */
19         rt_kprintf("Socket error\n");
20         return;
21     }
22 
23     /* �����ڴ� */
24     buffer_ptr = rt_malloc(length);
25     /* ���췢������ */
26     for (index = 0; index < length; index ++)
27         buffer_ptr[index] = index & 0xff;
28 
29     timeout = 100;
30     /* ���÷��ͳ�ʱʱ��100ms */
31     setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
32     /* ��ʼ��Ԥ���ӵķ���˵�ַ */
33     server_addr.sin_family = AF_INET;
34     server_addr.sin_port = htons(port);
35     server_addr.sin_addr = *((struct in_addr *)host->h_addr);
36     rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
37 
38     /* ���ӵ������ */
39     err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
40     rt_kprintf("TCP thread connect error code: %d\n", err);
41 
42     while (1)
43     {
44         /* �������ݵ�sock���� */
45         result = send(sock, buffer_ptr, length, MSG_DONTWAIT);
46         if (result < 0) //���ݷ��ʹ�����
47         {
48             rt_kprintf("TCP thread send error: %d\n", result);
49             closesocket(sock);
50 
51             /* �ر����ӣ����´������� */
52             rt_thread_delay(10);
53 
54             if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
55                 rt_kprintf("TCP Socket error:%d\n", sock);
56 
57             err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
58             rt_kprintf("TCP thread connect error code: %d\n", err);
59         }
60         else if (result == 0)
61         {
62             /* ��ӡsend��������ֵΪ0�ľ�����Ϣ */
63             rt_kprintf("\n Send warning,send function return 0.\r\n");
64         }
65     }
66 }
67 
68 #ifdef RT_USING_FINSH
69 #include <finsh.h>
70 /* ���tcpclient������finsh shell�� */
71 FINSH_FUNCTION_EXPORT(tcp_senddata, send a packet through tcp connection);
72 #endif
73 
74