社区
网络及通讯开发
帖子详情
请教:Winsock API编程问题,如何知道连接的客户端信息?
rudolf_he
2006-02-09 03:49:28
请教:
用Winsock API函数写服务器端程序。
当有客户端程序连接时,如何知道客户端的IP等相关信息啊?
比如客户端的IP、名称等。
...全文
141
9
打赏
收藏
请教:Winsock API编程问题,如何知道连接的客户端信息?
请教: 用Winsock API函数写服务器端程序。 当有客户端程序连接时,如何知道客户端的IP等相关信息啊? 比如客户端的IP、名称等。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
netsys2
2006-02-10
打赏
举报
回复
格 式: SOCKET PASCAL FAR accept( SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen );
参 数: s Socket的识别码 addr 存放来连接的彼端的位址 addrlen addr的长度
传回值: 成功 - 新的Socket识别码 失败 - INVALID_SOCKET (呼叫 WSAGetLastError() 可得知原因)
说明: Server 端之应用程式呼叫此一函式来接受 Client 端要求之Socket 连接动作;如果Server 端之 Socket 是为 Blocking 模式,且没有人要求连接动作,那麽此一函式会Block 函式马上回覆错误。accept() 函式的答覆值为一新的 Socket,此 Socket 不可再用来接受其它的连接要求;但是原先之 Socket 仍可接受其他人的连接要求。
(26) gethostname():获取目前使用者使用的 host 的名称。
格式: int PASCAL FAR gethostname( char FAR *name, int namelen );
参数: name 用来存放 host 名称的暂存区,namelen name 的大小
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式用来获取 host 的名称。
rudolf_he
2006-02-10
打赏
举报
回复
再请教:
1、ssock=accept(msock, (struct sockaddr *)&fsin, &alen);
此句中 alen 的定义是什么?
2、hostname怎么使用?
谢谢!
rudolf_he
2006-02-10
打赏
举报
回复
基本测试好了。
谢谢 netsys2(来电!) 的耐心指点!!
rudolf_he
2006-02-10
打赏
举报
回复
晕 CSDN 又写错了!
netsys2
2006-02-10
打赏
举报
回复
// Unit3.cpp 通讯线程代码
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#pragma package(smart_init)
__fastcall Ttransmit::Ttransmit(bool CreateSuspended)
: TThread(CreateSuspended)
{
this->Suspend();
this->FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall Ttransmit::Init(SOCKET *socket,HANDLE hwnd,AnsiString CADD)
{
msock=*socket;
m_hwnd=hwnd;
ClientAddr=CADD;
this->Resume();
}
void __fastcall Ttransmit::Execute()
{
SendMessage(m_hwnd,WM_SOCKET,ACCEPTOK,long(ClientAddr.c_str()));
int cc=0;
while(!this->Terminated)
{
memset(xbbbuf,0x00,4096);
cc=recv(msock,xbbbuf,4096,0);
if(cc==SOCKET_ERROR || cc<=0)
{
//接收数据失败
memset(m_ErrMsg,0x00,50);
strcpy(m_ErrMsg,"断开连接");
SendMessage(m_hwnd,WM_SOCKET,RECVERR,(long)m_ErrMsg);
closesocket(msock);
this->Terminate();
}
//xbbbuf中是接收到的数据
//处理代码。。。。
//发送数据用以下代码
/*
long datalen;//数据长度
if(send(msock,xbbbuf,datalen,0)==SOCKET_ERROR)
{
memset(m_ErrMsg,0x00,50);
strcpy(m_ErrMsg,"发送通讯指令失败");
SendMessage(m_hwnd,WM_SOCKET,SENDERR,(long)m_ErrMsg);
closesocket(msock);
this->Terminate();
}
else
{
//发送成功
} */
}
}
//---------------------------------------------------------------------------
//Unit3.h
//---------------------------------------------------------------------------
#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <winsock.h>
#define WSVERS MAKEWORD(1,0)
#define WM_SOCKET WM_USER + 1000
#define INITOK 1
#define INITERR 2
#define CREATEOK 3
#define CREATEERR 4
#define BINDOK 5
#define BINDERR 6
#define LISTENOK 7
#define LISTENERR 8
#define ACCEPTOK 9
#define ACCEPTERR 10
#define REMOTEQUEAST 11
#define SENDERR 12
#define RECVERR 13
#define WORKPOS 14
#define ACCEPTFINISH 15
#define THREADEND 16
#define FILESTART 17
//---------------------------------------------------------------------------
class Ttransmit : public TThread
{
private:
HANDLE m_hwnd;
AnsiString ClientAddr;
char xbbbuf[4096];
char m_ErrMsg[50]; //出错消息说明字符串指针
protected:
void __fastcall Execute();
public:
__fastcall Ttransmit(bool CreateSuspended);
void __fastcall Init(SOCKET *socket,HANDLE hwnd,AnsiString CADD);
SOCKET msock;
};
//---------------------------------------------------------------------------
#endif
netsys2
2006-02-10
打赏
举报
回复
主 题: 最近见问ServerSocket的哥们挺多的。我觉得ServerSocket不好。我一般用socket api写Server端。下面是一段示例代码。希望对正在写这方面的兄弟有用。
作 者: pp616 (傻小子)
等 级:
信 誉 值: 100
所属论坛: C++ Builder 网络编程/分布式开发
问题点数: 20
回复次数: 12
发表时间: 2003-03-31 13:51:33
//Unit1.cpp 窗体
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Tlisten *tlisten;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(tlisten==NULL)
{
tlisten =new Tlisten(false);
tlisten->Init(Handle,atol(edit->Text.c_str()));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(tlisten)
{
tlisten->Terminate();
tlisten=NULL;
}
}
//---------------------------------------------------------------------------
//你需要自己写一个消息map来响应WM_SOCKET消息
//消息里的参数意思在unit3.h中有定义
//Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *edit;
TButton *Button1;
TListBox *ListBox1;
TLabel *Label1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
回复人: pp616(傻小子) ( ) 信誉:100 2003-03-31 13:53:00 得分:0
//Unit2.cpp 监听线程代码
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit3.h"
#pragma package(smart_init)
Ttransmit *transmit;
__fastcall Tlisten::Tlisten(bool CreateSuspended)
: TThread(CreateSuspended)
{
this->Suspend();
this->FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall Tlisten::Init(HANDLE hwnd,long lport)
{
m_hwnd=hwnd;
m_port=lport;
this->Resume();
}
void __fastcall Tlisten::Execute()
{
AnsiString Cadd;
struct sockaddr_in fsin,sin;
SOCKET ssock;
struct hostent *hostname;
int alen;
WSADATA wsadata;
if(WSAStartup(WSVERS,&wsadata)!=0)
{
//启动WinSock失败
SendMessage(m_hwnd,WM_SOCKET,INITERR,0);
return;
}
//启动WinSock成功
SendMessage(m_hwnd,WM_SOCKET,INITOK,0);
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr("");
sin.sin_port=htons(m_port);
msock=socket(PF_INET,SOCK_STREAM,0);
if(msock==INVALID_SOCKET)
{
//创建Socket失败
SendMessage(m_hwnd,WM_SOCKET,CREATEERR,0);
WSACleanup();
return;
}
SendMessage(m_hwnd,WM_SOCKET,CREATEOK,0);
if(bind(msock,(struct sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
{
//帮定Socket失败
SendMessage(m_hwnd,WM_SOCKET,BINDERR,0);
closesocket(msock);
WSACleanup();
return;
}
SendMessage(m_hwnd,WM_SOCKET,BINDOK,0);
if(listen(msock,5)==SOCKET_ERROR)
{
//监听失败
SendMessage(m_hwnd,WM_SOCKET,LISTENERR,0);
closesocket(msock);
WSACleanup();
return;
}
SendMessage(m_hwnd,WM_SOCKET,LISTENOK,0);
while(!this->Terminated)
{
alen=sizeof(struct sockaddr);
ssock=accept(msock, (struct sockaddr *)&fsin, &alen);
if(ssock==INVALID_SOCKET)
{
//接受请求失败
SendMessage(m_hwnd,WM_SOCKET,ACCEPTERR,0);
closesocket(msock);
WSACleanup();
this->Terminate();
return;
}
//接受请求成功。启动新线程接管
Cadd=AnsiString(inet_ntoa(fsin.sin_addr));
transmit=new Ttransmit(false); //启动新的线程接管accept到的socket
transmit->Init(&ssock,m_hwnd,Cadd);
}
}
//---------------------------------------------------------------------------
//Unit2.h
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <winsock.h>
#define WSVERS MAKEWORD(1,0)
//---------------------------------------------------------------------------
class Tlisten : public TThread
{
private:
HANDLE m_hwnd;
long m_port;
protected:
void __fastcall Execute();
public:
__fastcall Tlisten(bool CreateSuspended);
void __fastcall Init(HANDLE hwnd,long lport);
SOCKET msock;
};
//---------------------------------------------------------------------------
#endif
rudolf_he
2006-02-10
打赏
举报
回复
不知道MSDN是否提供修改的功能?
发现写错了也不能修改,真的是很郁闷的。
rudolf_he
2006-02-10
打赏
举报
回复
继续请教 netsys2(来电!)
我的代码是参考:http://www.ccrun.com/article/go.asp?i=569&d=1w5p2y
改写的。
再多线程中 ssock=accept(msock, (struct sockaddr *)&fsin, &alen); 这句因该放在什么位置比较合适呢?
这样写:
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
{
szTmp[0] = '\0';
m_AcceptSocket = m_Socket;
FreeOnTerminate = true; //如果设定成 false ,则不会执行销毁操作
PSTNForm->Memo1->Lines->Add("创建线程"); //这个函数应该是这个功能吧???
int alen = sizeof(struct sockaddr);
ssock=accept(m_Socket, (struct sockaddr *)&fsin, &alen);
if(ssock==INVALID_SOCKET)
{
closesocket(m_Socket);
WSACleanup();
return;
}
//接受请求成功
ShowMessage(AnsiString(inet_ntoa(fsin.sin_addr)));
}
好像是不行的。
netsys2
2006-02-09
打赏
举报
回复
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct sockaddr_in fsin,sin;
SOCKET ssock;
struct hostent *hostname;
ssock=accept(msock, (struct sockaddr *)&fsin, &alen);
if(ssock==INVALID_SOCKET)
{
closesocket(msock);
WSACleanup();
return;
}
//接受请求成功
ShowMessage(AnsiString(inet_ntoa(fsin.sin_addr)));
UML之用例图
统一建模语言(UML)是一种通用的可视化建模语言,可以用来描述、可视化、构造和文档化软件密集型系统的各种工件。UML是独立于过程的,它适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具。注:UML不是一种程序设计语言,其描述的模型可以和各种
编程
语言相联系。一个完整的用例模型应该不仅仅包括用例图部分,还要有完整的用例描述部分。用例名称:描述用例的意图或实现的目标,一般为动词或动宾短语。用例编号:用例的唯一标识符,在其他位置可以使用该标识符来引用用例。
统一建模语言UML简答题/期末考试分享
1、简述统一建模语言(UML): 答:统一建模语言(UML)是一种绘制软件蓝图的标准语言。可以用UML对软件密集型系统的制品进行可视化详述和文档化。UML是一种定义良好、易于表达、功能强大且普遍适用的可视化建模语言。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。UML的作用就是用很多图从静态和动态方面来全面描述我们将要开发的系统。 2、UML中的交互图有两种,分别是顺序图和协作图,请分析一下两者之间的主要差别和各自的优缺点。
UML之用例图和类图
软件建模 软件建模的作用是把源于现实世界的
问题
转化为计算机可以理解和实现的过程。 软件建模的实现过程是从需求入手, 用模型表达分析设计过程, 最终将模型映射成软件实现. UML (1)UML(United Modeling Language, 统一建模语言): 是一种基于面向对象的可视化建模语言. (2)UML 采用了一组形象化的图形(如类图)符号作为...
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章