java socket 回调函数_socket client 回调函数接口

该博客介绍了一个使用C++实现的TCP客户端,它使用了Java Socket风格的回调函数接口。通过定义不同类型的回调函数,如连接、发送、接收、断开连接和心跳回调,实现了与服务器的交互。在连接失败时,客户端会自动重试,同时具备心跳机制,当接收到消息或发生错误时,相应的回调函数会被触发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*!

******************************************************************************

* \File

* socket client

* \data

*   2017.10.10

* \Author

*  tqq

******************************************************************************

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXBUF 1024

//================================tcp socket comm======================================================

typedef void (*CONNECT_CALL_BACK)(int,void *,unsigned short);

typedef void (*SEND_CALL_BACK)(int,char *,unsigned short);

typedef int (*RECV_CALL_BACK)(int,char *,int);

typedef void (*DISCONNECT_CALL_BACK)(int,char *,unsigned short,char * ,unsigned short);

typedef void (*HEARTBEAT_CALL_BACK)(int);

int sockfd, sock_len;

struct sockaddr_in dest;

char sock_buffer[MAXBUF];

fd_set rfds;

struct timeval tv;

int retval, maxfd = -1;

int tcp_client(unsigned char *ip,unsigned short port,SEND_CALL_BACK sends_cb,RECV_CALL_BACK recv_cb,CONNECT_CALL_BACK connect_cb,DISCONNECT_CALL_BACK disconnect_cb,HEARTBEAT_CALL_BACK heartbeat_cb,unsigned int heartbeat_time);

//================================tcp socket comm======================================================

void  sock_send_callback(int socket,char * buf,unsigned short len)

{

}

int  sock_recv_callback(int socket,char * buf,int len)

{

}

void  sock_connect_callback(int socket,void * buf,unsigned short len)

{

printf("connect the server success!!\n");

}

void  sock_hb_callback(int socket)

{

printf("heart beat\n");

}

void  sock_disconnect_callback(int socket,char *recvbuf,unsigned short recvlen,char *sendbuf ,unsigned short sendlen)

{

printf("the server disconnect ..\n");

tcp_client("10.39.132.95",6000,sock_send_callback,sock_recv_callback,sock_connect_callback,sock_disconnect_callback,sock_hb_callback,5);

}

int tcp_client(unsigned char *ip,unsigned short port,SEND_CALL_BACK sends_cb,RECV_CALL_BACK recv_cb,CONNECT_CALL_BACK connect_cb,DISCONNECT_CALL_BACK disconnect_cb,HEARTBEAT_CALL_BACK heartbeat_cb,unsigned int heartbeat_time)

{

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

{

perror("Socket");

exit(errno);

}

bzero(&dest, sizeof(dest));

dest.sin_family = AF_INET;

dest.sin_port = htons(port);

memset(&(dest.sin_zero), 0, 8);

if (inet_aton(ip, (struct in_addr*)&dest.sin_addr.s_addr) == 0)

{

perror(ip);

exit(errno);

}

while(1)

{

if (connect(sockfd, (struct sockaddr*)&dest, sizeof(dest)) != 0)

{

perror("Connect error");

}

else

break;

sleep(1);

}

connect_cb(sockfd,&dest,sizeof(dest));

sends_cb(sockfd,NULL,0);

printf("\nReady to start chatting.\n\

Direct input messages and \n\

enter to send messages to the server\n");

while (1)

{

FD_ZERO(&rfds);

FD_SET(0, &rfds);

maxfd = 0;

FD_SET(sockfd, &rfds);

if (sockfd > maxfd)

maxfd = sockfd;

tv.tv_sec = heartbeat_time;

tv.tv_usec = 0;

retval = select(maxfd+1, &rfds, NULL, NULL, &tv);

if (retval == -1)

{

printf("Will exit and the select is error! %s", strerror(errno));

break;

}

else if (retval == 0)

{

//printf("No message comes, no buttons, continue to wait ...\n");

heartbeat_cb(sockfd);

}

else

{

if (FD_ISSET(sockfd, &rfds))

{

bzero(sock_buffer, MAXBUF+1);

sock_len = recv(sockfd, sock_buffer, MAXBUF, 0);

if (sock_len > 0)

{

printf("Successfully received the message: "%s",%d bytes of data\n",

sock_buffer, sock_len);

recv_cb(sockfd,sock_buffer,sock_len);

}

else

{

if (sock_len < 0)

printf("Failed to receive the message! \

The error code is %d, error message is "%s"\n",

errno, strerror(errno));

else

printf("Chat to terminate!\n");

break;

}

}

}

}

close(sockfd);

disconnect_cb(sockfd,NULL,0,NULL,0);

return 0;

}

int main(int argc, char **argv)

{

tcp_client("10.39.132.95",6000,sock_send_callback,sock_recv_callback,sock_connect_callback,sock_disconnect_callback,sock_hb_callback,5);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值