linux socket recv 段错误

yuan_nice 2014-05-11 05:01:40
本人在linux端做一个简单的socket客户端测试程序。
但是在运行过程中,执行到接收对方响应报文长度的代码处就报段错误
read_count = recv(g_bf_socket, buffer, 4, 0);


请高手帮忙分析分析是什么导致,我真的看不出代码哪里有问题啊?如果去掉这行代码就什么问题都没有。


全部代码如下:


#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;
}

...全文
275 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuan_nice 2014-05-12
  • 打赏
  • 举报
回复
的确是那个导致
yuan_nice 2014-05-11
  • 打赏
  • 举报
回复
是哦,有可能是这个导致出现段错误,明天我去试下。
Pump天天学习 2014-05-11
  • 打赏
  • 举报
回复 1
printf("need recv length=[%s] szLen=[%s]\n", read_count, szLen); 这里吧 %d

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧