江湖救急,socekt通讯 ,为什么我发送接收不成功,有源码,哪位老大帮看看错哪了?

wenyongjie 2008-12-20 10:57:31
接收: #include <winsock2.h>
SOCKET m_RcvSock; //接收用的SOCK
bool InitRcvSock(DWORD m_RcvPort)
{
WSADATA data;
int ret=WSAStartup( 0x0202, &data );

m_RcvSock=socket( AF_INET, SOCK_DGRAM, 0 );
if( m_RcvSock==INVALID_SOCKET )
return false;

struct sockaddr_in Local_Addr;
ZeroMemory( &Local_Addr, sizeof(Local_Addr) );
Local_Addr.sin_family=AF_INET;
Local_Addr.sin_port=htons( m_RcvPort );//接收端口
Local_Addr.sin_addr.S_un.S_addr=INADDR_ANY;
ret=bind( m_RcvSock, (sockaddr*)&Local_Addr, sizeof(struct sockaddr_in) );
if( ret==SOCKET_ERROR )
{
closesocket( m_RcvSock );
m_RcvSock=INVALID_SOCKET;
return false;
}
return true;
}
//----------------------
void Recving( )
{
struct sockaddr_in Addr_From;
ZeroMemory( &Addr_From, sizeof(Addr_From) );
char buffer[1024];
long bytes = 0;
int i;
bool m_IsRecving = true;

while( m_IsRecving )
{
i = sizeof(Addr_From);
buffer[0]='\0';
ShowMessage("运行到这里就不行了");
bytes = recvfrom( m_RcvSock, (char*)buffer, 1024, 0, (sockaddr*)&Addr_From, (int *)&i );
ShowMessage(buffer);////在上面这句卡死了

if( (bytes == SOCKET_ERROR) || (bytes == 0) )
{
if( bytes == SOCKET_ERROR )
{
///
}
if( bytes==0 )
{
//
}
m_IsRecving = false;
}
else
{
///
}
}


}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
InitRcvSock(2018);
Recving();
}
//---------------------------------------------------------------------------

发送:#include <winsock2.h>
SOCKET m_SendSock; //发送用的SOCK
bool InitSendSock( void )//初始化
{
WSADATA data;
int ret=WSAStartup( 0x0202, &data );
if( m_SendSock!=INVALID_SOCKET ) return true;
m_SendSock=socket( AF_INET, SOCK_DGRAM, 0 );
if( m_SendSock==INVALID_SOCKET )
return false;

struct sockaddr_in Local_Addr;
ZeroMemory( &Local_Addr, sizeof(Local_Addr) );
Local_Addr.sin_family=AF_INET;
Local_Addr.sin_port=htons( 0 );/////
Local_Addr.sin_addr.S_un.S_addr=INADDR_ANY;
ret=bind( m_SendSock, (sockaddr*)&Local_Addr, sizeof(Local_Addr) );
if( ret==SOCKET_ERROR )
{
closesocket( m_SendSock );
m_SendSock=INVALID_SOCKET;
//提示出错
return false;
}

return true;
}

//------------------------------------------------------------------------------
bool SendData(DWORD m_SendPort ,char * m_SendIp ,const char *buffer, long inLength ) //发送
{
struct sockaddr_in To_Addr;
ZeroMemory( &To_Addr, sizeof(To_Addr) );
To_Addr.sin_family=AF_INET;
To_Addr.sin_port=htons( m_SendPort ); //端口
if( strlen( m_SendIp ) <1 )
{
//提示出错
return false;
}
To_Addr.sin_addr.S_un.S_addr=inet_addr( m_SendIp );//发送IP
if( To_Addr.sin_addr.S_un.S_addr==INADDR_NONE )
{
//提示出错 return false;
}
if( strlen(buffer) <1 )
{
//提示出错
return false;
}

int val=sendto( m_SendSock, buffer, inLength, 0, (sockaddr*)&To_Addr, sizeof(To_Addr) );
if( val == SOCKET_ERROR )
{
//提示出错
return false;
}

return true;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
InitSendSock();
SendData(2018,"192.168.1.112","Hello",6);
}
//---------------------------------------------
为什么不行呢?奇怪了
...全文
80 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxw1987628 2008-12-20
  • 打赏
  • 举报
回复

#include <winsock2.h>
#include <windows.h>
#include <iostream>
using namespace std;

unsigned long __stdcall ThreadFunc(void* pParam);
SOCKET m_RcvSock; //接收用的SOCK
SOCKET m_SendSock; //发送用的SOCK
bool InitRcvSock(DWORD m_RcvPort)
{
WSADATA data;
int ret=WSAStartup(MAKEWORD(2,2), &data );
m_RcvSock=socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

struct sockaddr_in Local_Addr;
ZeroMemory( &Local_Addr, sizeof(Local_Addr) );
Local_Addr.sin_family=AF_INET;
Local_Addr.sin_port=htons( m_RcvPort );//接收端口
Local_Addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
ret=bind( m_RcvSock, (sockaddr*)&Local_Addr, sizeof(struct sockaddr_in) );
if( ret==SOCKET_ERROR )
{
cout<<" bind error ...."<<GetLastError()<<endl;
closesocket( m_RcvSock );
system("pause");
}
return true;
}
//----------------------
void Recving( )
{
struct sockaddr_in Addr_From;
ZeroMemory( &Addr_From, sizeof(Addr_From) );
char buffer[1024]={0};
long bytes = 0;
int i= sizeof(Addr_From);
bool m_IsRecving = true;

while( m_IsRecving )
{
bytes = recvfrom( m_RcvSock, (char*)buffer, 1024, 0, (sockaddr*)&Addr_From, &i );
if( (bytes == SOCKET_ERROR) || (bytes == 0) )
{
if( bytes == SOCKET_ERROR )
cout<<"socket error!"<<endl;
if( bytes==0 )
cout<<"server closed !"<<endl;
m_IsRecving = false;
}
else
{
cout<<bytes<<" bytes receved."<<endl;
cout<<"content:"<<buffer<<endl;
}
}
}

bool InitSendSock( void )//初始化
{
WSADATA data;
int ret=WSAStartup(MAKEWORD(2,2), &data );
m_SendSock=socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
return true;
}

//------------------------------------------------------------------------------
bool SendData(DWORD m_SendPort ,char * m_SendIp ,const char *buffer, long inLength ) //发送
{
struct sockaddr_in To_Addr;
ZeroMemory( &To_Addr, sizeof(To_Addr) );
To_Addr.sin_family=AF_INET;
To_Addr.sin_port=htons( m_SendPort ); //端口
To_Addr.sin_addr.S_un.S_addr=inet_addr( m_SendIp );//发送IP
int val=sendto( m_SendSock, buffer, inLength, 0, (sockaddr*)&To_Addr, sizeof(To_Addr) );
if( val == SOCKET_ERROR )
{
//提示出错
cout<<" send error "<<WSAGetLastError()<<endl;
}
return true;
}

unsigned long __stdcall ThreadFunc(void* pParam)
{
Recving();
return 0;
}

int main(int argc, char* argv[])
{

InitRcvSock(12000);
InitSendSock();
/*
为了便于你观察结果,我们将服务器程序和客户端程序写成了1个程序
我们启动一个线程,在线程里面接收数据并显示,因为recvfrom函数是
阻塞的,所以必须弄1个线程,以便我们后面可以发送数据
*/
::CreateThread(0,0,ThreadFunc,0,false,0);
SendData(12000,"127.0.0.1","helloworld",11);
getchar();
return 0;
}

//---------------------------------------------------------------------------
/*
首先,我估计你的代码是你自己做了一个类,封装了socket api,可能你是想在GUI

程序中来测试你这个程序 。但这里为了说明问题,我把他修改为console Wizrd了

我摈弃了你代码中关于socket错误的部分代码,以及一些不好的代码语句,但依然保留你

原有的风格,你的程序主干我没有改变。

*/
ooily 2008-12-20
  • 打赏
  • 举报
回复
ding

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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