|
本帖最后由 xujun 于 2018-8-3 16:26 编辑
- void vTaskSocket(void *arg)
- {
- char recvbuf[500];
- char sendbuf[500] ;
- uint8_t cmd = 0,i;
- uint16_t len = 0;
- int sock, res;
- unsigned long sck_mode;
- SOCKADDR_IN addr;
- while (1)
- {
- /* 创建一个socket
- 第1个参数AF_INET:当前仅支持这个类型的地址族。
- 第2个参数SOCK_STREAM:表示数据流通信类型,即使用的TCP。
- 第3个参数0 :配置为0的话,自动跟第2个参数进行协议匹配,这里就是TCP协议。
- */
- sock = socket (AF_INET, SOCK_STREAM, 0);
-
- /* 设置使能KEEP ALIVE,让客户端和服务器保存连接 */
- sck_mode = 1;
- res = ioctlsocket (sock, FIO_KEEP_ALIVE, &sck_mode);
- if (res == SCK_SUCCESS)
- {
- }
- else
- {
- }
- /* 端口号设置为1001 */
- addr.sin_port = htons(1001);
-
- /* 与函数socket中的AF_INET作用一样 */
- addr.sin_family = PF_INET;
-
- addr.sin_addr.s_b1 = 192;
- addr.sin_addr.s_b2 = 168;
- addr.sin_addr.s_b3 = 1;
- addr.sin_addr.s_b4 = 167;
- /* 客户端连接远程服务器,如果远程服务器还未创建,此函数会立即返回 */
- res = connect (sock, (SOCKADDR *)&addr, sizeof (addr));
- while (1)
- {
- /*
- socket数据接收函数,如果recv工作在阻塞模式,使用这个函数注意以下事项:
- 1. 此函数的溢出时间受到Net_Config.c中宏定义 BSD_RCVTOUT 的限制。溢出时间到会自动退出。
- 2. 这个函数接收到一次数据包就会返回,大于或者小于设置的缓冲区大小都没有关系,如果数据量
- 大于接收缓冲区大小,用户只需多次调用函数recv进行接收即可。
- 3. 实际接收到数据大小通过判断此函数的返回值即可。
- */
- res = recv (sock, recvbuf, sizeof(recvbuf), 0);
- if (res <= 0)
- {
- if((res == SCK_EINVALID) || (res == SCK_ECLOSED))
- {
-
- break;
- }
- }
- else
- {
- res = send (sock, (char *)sendbuf, len+14+2, 0);
- if (res < 0)
- {
- }
- else
- {
- }
- }
- }
- res = closesocket (sock);
- }
- }
复制代码 客户端主动连接服务器,一上电能连接成功,但服务主动关闭连接后,客户端就不能再连接,在线调试发现,socket设置的数量是5,重新连接5次就失败,sock返回-2 ,无效的socket,但明明已经close了失败的连接了,请教一下还是缺少什么操作么?
发现如果是板子先上电,服务器没启动,连接5次后也是失败一直不能再连接了。怀疑是不是还缺少什么操作?好像是socket没有释放掉
|
|