1,317
社区成员
发帖
与我相关
我的任务
分享
#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错误的部分代码,以及一些不好的代码语句,但依然保留你
原有的风格,你的程序主干我没有改变。
*/