社区
网络及通讯开发
帖子详情
请教:Winsock API编程问题,如何知道连接的客户端信息?
rudolf_he
2006-02-09 03:49:28
请教:
用Winsock API函数写服务器端程序。
当有客户端程序连接时,如何知道客户端的IP等相关信息啊?
比如客户端的IP、名称等。
...全文
139
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)));
Windows下的网络
编程
Winsock
本文详细介绍了Windows平台下使用
Winsock
进行网络
编程
的基本步骤,包括初始化
Winsock
环境(WSAStartup)、创建套接字、绑定IP和端口(bind)、监听
连接
(listen)、接受
客户端
连接
(accept)、关闭套接字(closesocket)以及发送和接收数据的函数send和recv。文章还提到了
Winsock
的版本、结构体WSAData、套接字的概念以及TCP/IP协议的相关知识。
Cpp网络
编程
Winsock
API
本文介绍了Cpp网络
编程
中
Winsock
API
的使用,包括服务端和
客户端
程序的编写。服务端需完成初始化网络库、创建套接字对象、绑定ip和端口等步骤;
客户端
则要初始化网络库、
连接
服务端等。还对相关函数的参数和返回值进行了解释。
windows
编程
--网络
编程
学习--
winsock
编程
(2)
本文介绍了Windows系统下利用
Winsock
2进行网络
编程
的基础知识,包括
Winsock
版本、所需的头文件和库、TCP/IP模型的应用。通过创建套接字、绑定地址、监听
连接
、接受请求等步骤,详细讲解了TCP协议的实现过程,并提供了服务器和
客户端
的代码示例。
C++
Winsock
2网络
编程
实践:下载Demo服务器与
客户端
本文介绍用C++和
Winsock
2
API
编写的简单下载演示程序,涵盖服务器和
客户端
实现。详细讲解
Winsock
2基础、服务器与
客户端
编程
模型,分析非多线程局限与断点续传缺失
问题
,还提及GUI实现、文件传输I/O操作、错误处理及资源清理,为网络
编程
初学者提供基础。
Winsock
API
编程
介绍
本文介绍了
Winsock
API
的基本概念及其在网络
编程
中的应用。讲解了TCP/IP协议与
Winsock
的关系,并通过实例演示了如何在Win32平台上创建服务器端和
客户端
进行通信。
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章