您的位置:首页 > 其它

一个简单的服务器和客户端的心跳程序

2013-04-15 23:25 330 查看
程序是基于TCP的,只是为了测试,功能并不完善。

大多数的心跳都是UDP协议。当服务器端的数据和心跳在同一端口时,TCP协议很容易出现心跳被阻塞的情况。

服务器端代码:

View Code

#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <string>
#include <pthread.h>
using namespace std;

const short SHAKE_PORT = 9526;
const short CLIENT_PORT = 9527;
const int MAX_CONN_NUM = 5;
const string CLIENT_IP = "192.168.1.106";
const int MAX_DATA_LENGTH = 255;
const int MSG_SHAKE_LENGTH = 20;

struct ShakeHands
{
int iConnID;
int iLength; //通信双方约定,iLength为20即为握手消息
int iSendID;
int iReceiveID;
char extend[4];

void SwapID()
{
int tmp;
tmp = iSendID;
iSendID = iReceiveID;
iReceiveID = tmp;
}
};

void* ShakeHands(void* arg)
{
struct ShakeHands msg;
msg.iConnID = 123;
msg.iLength = sizeof(struct ShakeHands);
msg.iSendID = 1;
msg.iReceiveID = 2;
int res;

sockaddr_in* pTmp = (sockaddr_in*)arg;
int shakefd = -1;

while(1)
{
shakefd = socket(AF_INET, SOCK_STREAM, 0);
cout << "Start to send shakehands" << endl;
res = connect(shakefd, (sockaddr*)pTmp, sizeof(*pTmp));
if (-1 == res)
{
cerr << "connect failed" << std::endl;
sleep(1);
continue;
}

write(shakefd, &msg, msg.iLength);
memset(&msg, 0, sizeof(struct ShakeHands));
read(shakefd, &msg, MAX_DATA_LENGTH);
if (MSG_SHAKE_LENGTH == msg.iLength)
{
cout << "shake hands succeed" << endl;
}
sleep(5);
}
close(shakefd);
pthread_exit(const_cast<char*>("exit"));
}

int main()
{
int sockfd = 0;
int len = 0;
struct sockaddr_in address;
char ch[MAX_DATA_LENGTH] = "Hello Server!";

address.sin_family = AF_INET;
address.sin_port = htons(CLIENT_PORT);
address.sin_addr.s_addr = inet_addr("192.168.1.105");
len = sizeof(address);

pthread_t m_thread;
void* result;

int res = pthread_create(&m_thread, NULL, ShakeHands, (void*)&address);
if (-1 == res)
{
cerr << "thread create failed";
exit(EXIT_FAILURE);
}

//此处做主线程工作

res = pthread_join(m_thread, &result);
if (0 != res)
{
cerr << "thread join failed";
exit(EXIT_FAILURE);
}

exit(EXIT_SUCCESS);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐