23,110
社区成员
发帖
与我相关
我的任务
分享
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include<signal.h>
#define BUFFER_SIZE 10240
/************************************************************************/
/* 客户端 */
/************************************************************************/
#define BIG_FRONT_END_IP ("192.168.10.146") //
#define BIG_FRONT_END_PORT 9999 //
int g_bf_socket; //
struct sockaddr_in g_bf_addr; //
int bf_init(); //初始化与xxx通信相关的定义
int bf_transaction(); //与xxx进行一次短连接,发送请求报文后接收响应报文
int bf_connect(); //连接xxx
const char tran12345[] =
{
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
<SERVICE xmlns=\"http://www.xxx.com/xxx/\">\
<SERVICE_HEADER>\
<SERVICE_SN>xxxxxx</SERVICE_SN>\
<SERVICE_ID>123456</SERVICE_ID>\
<ORG>xxxxxx</ORG>\
<CHANNEL_ID>05</CHANNEL_ID>\
<OPT_ID></OPT_ID>\
<REQUST_TIME>xxxxxx</REQUST_TIME>\
<VERSION_ID>01</VERSION_ID>\
<MAC/>\
</SERVICE_HEADER>\
<SERVICE_BODY>\
<EXT_ATTRIBUTES>\
<AUTH>\
<Q_PIN>xxx</Q_PIN>\
</AUTH>\
</EXT_ATTRIBUTES>\
<REQUEST>\
<CARD_NO>xxxxxx</CARD_NO>\
<CURR_CD>xxx</CURR_CD>\
</REQUEST>\
</SERVICE_BODY>\
</SERVICE>"};
int main(int argc, char **argv)
{
printf("start init...\n");
//signal(SIGINT,SIG_IGN);
//signal(SIGPIPE,SIG_IGN);
//signal(SIGQUIT,SIG_IGN);
////signal(SIGTERM,EXIT);
//signal(SIGUSR1,SIG_IGN);
//signal(SIGCLD,SIG_IGN);
if ( bf_init() == -1 )
{
exit(1);
}
if ( bf_transaction() == -1 )
{
exit(1);
}
return 0;
}
int bf_init()
{
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr));
client_addr.sin_family = AF_INET; //internet协议族
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址
client_addr.sin_port = htons(0); //0表示让系统自动分配一个空闲端口
g_bf_socket = socket(AF_INET, SOCK_STREAM, 0);
if ( g_bf_socket < 0 )
{
printf("Create Socket Failed!\n");
return -1;
}
else
{
printf("Create Socket success.\n");
}
if ( bind(g_bf_socket,(struct sockaddr*)&client_addr, sizeof(client_addr)) )
{
printf("Client Bind Port Failed!\n");
return -1;
}
else
{
printf("bind success\n");
}
bzero(&g_bf_addr, sizeof(g_bf_addr));
g_bf_addr.sin_family = AF_INET;
g_bf_addr.sin_addr.s_addr = inet_addr("192.168.10.146");
g_bf_addr.sin_port = htons(BIG_FRONT_END_PORT);
}
int bf_connect()
{
if ( connect(g_bf_socket,(struct sockaddr*)&g_bf_addr, sizeof(g_bf_addr)) < 0 )
{
return -1;
}
return 0;
}
int bf_transaction()
{
char buffer[BUFFER_SIZE];
char szLen[5];
int len, read_count;
if ( bf_connect() == -1 )
{
printf("connect fail.\n");
return -1;
}
else
{
printf("connect success.\n");
}
//发送4字节的请求报文长度
bzero(szLen, sizeof(szLen));
sprintf(szLen, "%04d", strlen(tran12345));
len = send(g_bf_socket, szLen, 4, 0);
printf("length:send content=[%s] real send length=[%d]\n", szLen, len);
//发送请求报文体
bzero(buffer, BUFFER_SIZE);
strncpy(buffer, tran12345, strlen(tran12345));
len = send(g_bf_socket, buffer, strlen(buffer), 0);
printf("buffer length:%d, send length:%d\n", strlen(buffer), len);
/*接收4字节的响应报文长度值*/
bzero(szLen, sizeof(szLen));
char sz[BUFFER_SIZE]={0};
bzero(buffer, sizeof(buffer));
read_count = recv(g_bf_socket, buffer, 4, 0);
printf("need recv length=[%s] szLen=[%s]\n", read_count, szLen);
//接收响应报文体
bzero(buffer, BUFFER_SIZE);
len = atoi(szLen);
printf("len=[%d]\n", len);
read_count = recv(g_bf_socket, buffer, len, 0);
printf("response message length=[%d]\n", read_count);
if ( read_count < 0 )
{
printf("Receive Data From xxx Failed!\n");
}
else
{
printf("receive:%s\n", buffer);
}
printf("one transaction cycle finish. app exit.\n");
close(g_bf_socket);
g_bf_socket = -1;
}