Socket通信 connect失败

du_hb 2017-10-19 01:10:33
本机为 Windows10操作系统,不用防火墙。
目标地址:127.0.0.1,错误码:10049。若目标地址为本机地址的话,错误码为:10051
换一台 WindowsXP操作系统的计算机上运行,则能正常连接到服务器。
服务器是在同一台计算机上运行的广州致远的TCP&UDP测试工具V1.038
源码如下:

//===========================================
//UDPClient.h
//---------------------------------------------------------------------------

#ifndef UDPClientH
#define UDPClientH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>

#include <stdio.h>
#define WM_SOCK WM_USER+100
//---------------------------------------------------------------------------
class TLANForm : public TForm
{
__published: // IDE-managed Components
TEdit *Port;
TLabel *Label1;
TLabel *Label2;
TComboBox *Prot;
TButton *Button1;
TLabel *Label3;
TEdit *Addr;
TEdit *TxtEdit;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
void __fastcall OnRecv(TMessage &Message);
public: // User declarations
__fastcall TLANForm(TComponent* Owner);

BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
extern PACKAGE TLANForm *LANForm;
//---------------------------------------------------------------------------
#endif

//===========================================
//UDPClient.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UDPClient.h"

#include "WinSock2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TLANForm *LANForm;

enum PROTO{TCP=0,UDP=1};
PROTO m_Protocol;
SOCKET m_Socket;
//---------------------------------------------------------------------------
__fastcall TLANForm::TLANForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TLANForm::FormCreate(TObject *Sender)
{
::SendMessage(Prot->Handle,CB_SETCURSEL,0,0); //设置组合框中默认选中的项
}
//---------------------------------------------------------------------------
void __fastcall TLANForm::OnRecv(TMessage &Message)
{
struct sockaddr_in from;
char buf[4096];
int nLen;
int nLength;

nLength = sizeof(struct sockaddr_in);

switch(WSAGETSELECTEVENT(Message.LParam))
{
case FD_READ:
switch(m_Protocol)
{
case TCP:
nLen=recv(m_Socket,buf,4096,0);
if(nLen>0)
{
buf[nLen]='/0';
TxtEdit->Text="Received Length:"+String(nLen)+"/r/n"+StrPas(buf);
}
break;
case UDP:
nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
if(nLen>0)
{
buf[nLen]='/0';
TxtEdit->Text="Received Length:"+String(nLen)+"/r/n"+StrPas(buf);
}
break;
}
break;

case FD_CLOSE:
closesocket(m_Socket);
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TLANForm::Button1Click(TObject *Sender)
{
char szTmp[256],buf[4096];
char ComputerName[255];
int nSize=0;
unsigned long nAddr;
UINT m_Port;
AnsiString addr;
String strTmp;
AnsiString AsTmp;
WSAData wsaData;
WORD version;
unsigned long nClient;
struct hostent* he;
struct sockaddr_in client;
struct sockaddr_in To;
fd_set FDSET;
int nLen;

addr=Addr->Text.Trim();
if(addr.IsEmpty())
{
::MessageBox(0,L"Please enter the server IP!",L"Error",MB_OK+MB_ICONERROR);
return;
}

nAddr=inet_addr(addr.c_str()); //点分十进制IP转为长整型数,若不合法则返回INADDR_NONE
if(nAddr==INADDR_NONE)
{
::MessageBox(0,L"Bad Internet IP!",L"Error",MB_OK+MB_ICONERROR);
return;
}

try
{
m_Port=Port->Text.ToInt();
}
catch(Exception &e)
{
::MessageBox(0,e.Message.c_str(),L"Error",MB_OK+MB_ICONERROR);
return;
}

switch(Prot->ItemIndex)
{
case 0:
m_Protocol=TCP;
break;
case 1:
m_Protocol=UDP;
break;
}

if(TxtEdit->Text.IsEmpty())
{
::MessageBox(0,L"Please enter the text you want to send!",L"Error",MB_OK+MB_ICONERROR);
return;
}

//Initialize Winsocket
::ZeroMemory(&wsaData,sizeof(WSAData));
version=MAKEWORD(2,1);
if(::WSAStartup(version,&wsaData))
{
sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
return;
}

//Obtain the active connection
gethostname(ComputerName,255); //返回本地主机的标准主机名
he=gethostbyname(ComputerName); //返回对应于给定主机名的包含主机名字和地址信息的hostent结构的指针
if(!he)
{
sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
::WSACleanup();
return;
}

//create new socket
m_Socket=INVALID_SOCKET;
switch(m_Protocol)
{
case TCP:
m_Socket=socket(AF_INET,SOCK_STREAM,0); //建立一个通讯用的末端点,返回一个套接字
break;
case UDP:
m_Socket=socket(AF_INET,SOCK_DGRAM,0);
break;
}

if(m_Socket==INVALID_SOCKET)
{
sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
strTmp = szTmp;
::MessageBox(0,strTmp.c_str(),L"Error",MB_OK+MB_ICONERROR);
::WSACleanup();
return;
}

//bind socket
memcpy(&nClient,he->h_addr_list[0],sizeof(int));
if(nClient==INADDR_NONE)
{
sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
strTmp = szTmp;
::MessageBox(0,strTmp.c_str(),L"Error",MB_OK+MB_ICONERROR);
closesocket(m_Socket);
::WSACleanup();
return;
}

client.sin_family=AF_INET;
client.sin_port=0;
client.sin_addr.S_un.S_addr=(int)nClient;
if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr)))
{
sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
closesocket(m_Socket);
::WSACleanup();
return;
}

//connect socket
To.sin_family=AF_INET;
To.sin_port=htons(m_Port);
To.sin_addr.S_un.S_addr=(int)nAddr;
FD_ZERO(&FDSET);
FD_SET(m_Socket,&FDSET);

if(m_Protocol==TCP)
{
if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr)))
{
sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
strTmp = szTmp;
::MessageBox(0,strTmp.c_str(),L"Error",MB_OK+MB_ICONERROR);
closesocket(m_Socket);
::WSACleanup();
return;
}

if(select(1,0,&FDSET,0,0) <= 0)
{
sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
closesocket(m_Socket);
::WSACleanup();
return;
}
}

//Send data
AsTmp = TxtEdit->Text;
nLen = TxtEdit->Text.Length();
if(nLen > 4096)
{
sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
strTmp = szTmp;
::MessageBox(0,strTmp.c_str(),L"Error",MB_OK+MB_ICONERROR);
closesocket(m_Socket);
::WSACleanup();
return;
}

strncpy(buf,AsTmp.c_str(),nLen);
switch(m_Protocol)
{
case TCP:
nSize=send(m_Socket,buf,nLen,0);
//ShowMessage(nSize);
break;
case UDP:
nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
//ShowMessage(nSize);
break;
}

if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE))
{
sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
strTmp = szTmp;
::MessageBox(0,strTmp.c_str(),L"Error",MB_OK+MB_ICONERROR);
closesocket(m_Socket);
::WSACleanup();
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TLANForm::FormDestroy(TObject *Sender)
{
closesocket(m_Socket);
::WSACleanup();
}
//---------------------------------------------------------------------------
...全文
1313 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
du_hb 2017-10-23
  • 打赏
  • 举报
回复
自己顶起来
du_hb 2017-10-20
  • 打赏
  • 举报
回复
初次发贴求助,也不知道该发哪个模块。
du_hb 2017-10-19
  • 打赏
  • 举报
回复
先启动TCP&UDP测试工具,创建服务器,本机端口设置为4001,启动服务器。 然后再运行上述程序,协议选择TCP,点发送按钮,程序执行connect()函数后返回错误#10049 但是同样的程序在windowsXP系统下运行无此问题,不知道什么原因,怎么改?

4,354

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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