短信编程socket问题!

junlion 2003-10-09 08:55:17
小弟在编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;
}
...全文
31 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
studyingpersons 2003-10-22
  • 打赏
  • 举报
回复
gz
nj_draker 2003-10-22
  • 打赏
  • 举报
回复

你开一个线层去不断检测是否有数据进来,有就放到Buf[]中,

然后发出一个Event,通知另一个线层(WorkThread)去处理Buf中的数据

就OK啦。

注意BUF的的互斥处理!

你的程序可能是消息传递问题!
wanggangytsoft 2003-10-22
  • 打赏
  • 举报
回复
你这种socket写法早就过时了,直接用MFC的CSocket很简单!

if (!AfxSocketInit())
{
AfxMessageBox("Windows 通信端口初始化失败。");
return FALSE;
}

//Server


if (m_pServerSocket->Create(5001))
{
if (!m_pServerSocket->Listen())
{
::MessageBox(NULL,"监听Socket失败!","提示",MB_OK);
}
}
else
{
::MessageBox(NULL,"服务Socket创建失败!","提示",MB_OK);
}

studyingpersons 2003-10-10
  • 打赏
  • 举报
回复
帮你顶!!!
junlion 2003-10-09
  • 打赏
  • 举报
回复
好兄弟!
xjy521 2003-10-09
  • 打赏
  • 举报
回复
帮你顶

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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