socket通讯超时问题(极难)
leduo 2007-03-22 11:30:39 #include <iostream>
#include <arpa/inet.h>
#include <netdb.h>
#include <signal.h>
#include <setjmp.h>
#include <unistd.h>
int IsReadyToRead(int, int);
int IsReadyToWrite(int, int);
using namespace std;
class Tcp
{
public:
static jmp_buf TimeoutEnv;
static void signalhandle(int);
static int cli_net_open(char *,char *,int,char *);
static void cli_net_close(int);
static int send_data(int, char *, int, int);
static int recv_data_fromrcs(int, char *, int, int, int, int);
};
class Comm
{
public:
int CommCliDirect(char *, char *, char *);
};
jmp_buf Tcp::TimeoutEnv;
main()
{
int sockfd;
int nReturn;
char buf[32000];
char recvMsg[32000];
Comm *comm = new Comm();
while(1)
{
memset(recvMsg, 0x00, sizeof(recvMsg));
if (comm->CommCliDirect("", "01|01100|0010|99990003|0|3901110009000000745|3901110029200013774|01||653|00000000|20070101|||||", recvMsg) !=0)
{
cerr << "发送主机接口失败" << recvMsg << endl;
}
}
while(1)
{
while((sockfd=Tcp::cli_net_open("109.32.13.78","", 6001,(char *)0))<0)
{
sleep(5);
perror("err");
exit(-1);
}
sprintf(buf,"%s","01|01100|0010|99990003|0|3901110009000000745|3901110029200013774|01||653|00000000|20070101|||||");
printf("bufin=%s\n",buf);
if(IsReadyToWrite(sockfd, 1))
{
if((nReturn=Tcp::send_data(sockfd, buf, 95, 1)) < 0)
{
if ( nReturn != -1 )
{
printf("发送数据超时");
}
}
}
else
{
printf("发送数据超时");
}
if(IsReadyToRead(sockfd, 1))
{
memset(buf,0,sizeof(buf));
if((nReturn = Tcp::recv_data_fromrcs(sockfd, buf, 19, 14, 0, 1))<=0)
{
if ( nReturn != -1 && nReturn != 0)
{
printf("通讯超时!");
}
}
}
else
{
printf("通讯超时!");
}
Tcp::cli_net_close(sockfd);
printf("bufout=%s\n",buf);
}
}