短信编程socket问题!
小弟在编sgip的sp端的时候接受smg传过来的deliver包出问题了。在收到smg band命令后,sp返回bandrep成功,接着smg发送deliver包,但是sp端一直收不到,现怀疑是socket编程出了问题,望各位大侠出手相助救救小弟!
int SgipSocket::listensmg(char *localip,unsigned short port)
{
int i=3,ret = 0,err= 0,nErrorCode;
SgipSocket sgip;// = *( SgipSocket *)pdata;
SGIP_PKG pkg;
SOCKADDR_IN m_addr;
TIMEVAL timeout;
FD_SET fdset;
timeout.tv_sec=1;
timeout.tv_usec=0;
if(m_hSocket != NULL){
closesocket(m_hSocket);
m_hSocket = NULL;
}
if(m_hSocket == NULL){
//创建新的套接字,这里创建的是流类型的套接字
m_hSocket = socket(AF_INET, SOCK_STREAM,0);
ASSERT(m_hSocket != NULL);
}
m_addr.sin_family = AF_INET;
// m_addr.sin_addr.S_un.S_addr = INADDR_ANY;//任何地址都行
m_addr.sin_addr.S_un.S_addr=inet_addr(localip);
m_addr.sin_port = htons(port);
//邦定一个套接字到本机的地址
ret = bind(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR){
TRACE("Bind Error: %d \n", (err = WSAGetLastError()));
AfxMessageBox("Bind error");
return err;
}
//开始一个监听过程,等待客户的连接
ret = listen(m_hSocket, 2);//的第二个参数表示最多支持的客连接的个数
if(ret == SOCKET_ERROR){
TRACE("Listen Error: %d \n", (err = WSAGetLastError()));
AfxMessageBox("listen error");
return err;
}
while(1){
err=0;
FD_ZERO (&fdset);
FD_SET(m_hSocket,&fdset);
err=select(0,&fdset,NULL,NULL,&timeout);
if(SOCKET_ERROR==err)
{
nErrorCode=WSAGetLastError();
TRACE("select read status errorcode=%d",nErrorCode);
}
if(err==0)
{ // AfxMessageBox("没有数据进来");
continue;
}
else{
//该函数诸塞等待客户的连接
s= accept(m_hSocket, NULL, NULL);
if(s == SOCKET_ERROR){
TRACE("Accept Error: %d \n", (err = WSAGetLastError()));
AfxMessageBox("listen error");
return err;
}
// 先接收包头
int nsize = sizeof( SGIP_HEAD);
int err = recv(s,(char *)&pkg.Head, nsize, 0);
if( err != nsize )
{
AfxMessageBox(_T("listensmg接收包头错误"));
}
// 接收包体
nsize = ntohl(pkg.Head.Message_Lenght)-sizeof(SGIP_HEAD);
err = recv( s,(char*)&pkg.pk_data,nsize,0);
if(err!=nsize)
{//continue;
AfxMessageBox(_T("listensmg接收包体错误"));
}
// 根据命令字,确定存放位置,或者丢弃
int cmdid = ntohl( pkg.Head.Command_ID);
switch(cmdid) {
case SGIP_BIND: //返回bindresp包
smg_bind_resp(pkg);
//程序执行到这都行的
// 之后返回,不断的select但是都没有收到数据,程序就阻塞了下来
// 不断的死循环,是不是socket编写的流程有问题?还是smg模拟网关 //有问题?
break;
case SGIP_UNBIND: //返回Unbindresp包
smg_unbind_resp(pkg);
case SGIP_DELIVER:
//处理接收到的deliver包
smg_deliver(pkg);
break;
case SGIP_REPORT:
smg_report(pkg);
break;
default:;}
// cmdid=0;
}
} ;
closesocket(m_hSocket);
WSACleanup();
return 0;
}