C++ Builder中Socket 套接字问题

作者&投稿:叱干胖 (若有异议请与网页底部的电邮联系)
socket中套接字的问题,C++,急~

第1个 套接字变量会被系统回收

每句都注释实在没有必要。无非就是一个TCP的socket的连接过程。如果要学习的话建议看下TCP/IP详解卷一。另外孙鑫的C++视频教材里面有一章专门讲这个的,可以看一下。

、~~~~~~~~~~原型
typedef struct WSAData{
WORD wVersion; //WSAAtartup函数会将这个字段设置为将要使用的Winsock版本.
WORD wHighVersion; //现有Winsock库的最高版本.
char szDescription[WSADESCRTIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;//客同时打开的最大套接字数.取决与可用的物理资源.
unsigned short iMaxUdpDg; //数据报最大长度
char FAR* 1pVendorInfo; //保留字段
}WSADATA,*LPWSADATA ;

1.简单服务器
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
static UINT port=%%1;
UINT Listen(LPVOID pParam)
{
SOCKET sServer,sClient;
char buf[1024];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
WSACleanup();
return -1;//创建套接字失败
}
SOCKADDR_IN addrServ;
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons((short)pParam);
addrServ.sin_addr.s_addr=INADDR_ANY;
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//绑定套接字失败
}
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//开始监听失败
}
sockaddr_in addrClient;
int addrClientlen=sizeof(addrClient);
sClient=accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);
if(INVALID_SOCKET==sClient)
{
closesocket(sServer);
WSACleanup();
return -1;//开始接受客户端连接失败
}
ZeroMemory(buf,sizeof(buf));
retVal=recv(sClient,buf,sizeof(buf),0);
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return -1;//接收数据失败
}
CString %%2(buf);
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return 0;
}
CWinThread *pThread=AfxBeginThread(Listen,&port);

2.简单客户端
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
SOCKET sHost;
SOCKADDR_IN servAddr;
char buf[1024];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
WSACleanup();
return -1;//创建套接字失败
}
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr(%%3);
servAddr.sin_port=htons((short)%%2);
int nServAddlen=sizeof(servAddr);
retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR==retVal) {
closesocket(sHost);
WSACleanup();
return -1;//连接服务器失败
}
ZeroMemory(buf,sizeof(buf));
strcpy(buf,%%3);
retVal=send(sHost,buf,sizeof(buf),0);
if(SOCKET_ERROR==retVal)
{
closesocket(sHost);
WSACleanup();
return -1;//向服务器发送数据失败
}
closesocket(sHost);
WSACleanup();

3.获得本机IP
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
char szHostname[100],szHostaddress[200];
if(gethostname(szHostname,sizeof(szHostname))!=SOCKET_ERROR)
{
HOSTENT *pHostEnt=gethostbyname(szHostname);
if(pHostEnt!=NULL){
sprintf(szHostaddress,"%d.%d.%d.%d",
( pHostEnt->h_addr_list[0][0]&0x00ff ),
( pHostEnt->h_addr_list[0][1]&0x00ff ),
( pHostEnt->h_addr_list[0][2]&0x00ff ),
( pHostEnt->h_addr_list[0][3]&0x00ff ));
}
}
else
return;
CString %%1(szHostaddress);

5.点对点通信
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
SOCKADDR_IN addrServ,addrServ2;
SOCKET sServer,sClient,sHost;
int retVal;
sockaddr_in addrClient;
char buf[1024];
static UINT port=%%2;
BOOL listenerRun=TRUE;
UINT Listen(LPVOID pParam)
{
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons((UINT)pParam);
addrServ.sin_addr.s_addr=INADDR_ANY;
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//绑定套接字失败
}
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//开始监听失败
}
int addrClientlen=sizeof(addrClient);
sClient=accept(sServer,(sockaddr FAR*)&addrClient,&addClientlen);
if(INVALID_SOCKET==sClient)
{
closesocket(sServer);
WSACleanup();
return -1;//接收客户端请求失败
}
while(listenerRun)
{
ZeroMemory(buf,sizeof(buf));
retVal=recv(sClient,buf,sizeof(buf));
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return -1;//接收客户端数据失败
}
CString %%4(buf);
}
}
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
WSACleanup();
return -1;//创建套接字失败
}
CWinThread *pThread=AfxBeginThread(Listen,&port);
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
WSACleanup();
return -1;//创建套接字失败
}
servAddr2.sin_family=AF_INET;
servAddr2.sin_addr.s_addr=inet_addr(%%1);
servAddr.sin_port=htons((short)%%3);
int nServerAddrlen=sizeof(servAddr2);
retVal=connect(sHost,(LPSOCKADDR)&servAddr2,sizeof(servAddr2));
if(SOCKET_ERROR==retVal)
{
closesocket(sHost);
WSACleanup();
return -1;//连接失败
}
zeroMemory(buf,sizeof(buf));
strcpy(buf,%%5);
retVal=send(sHost,buf,sizeof(buf),0);
if(SOCKET_ERROR==retVal)
{
closesocket(sHost);
WSACleanup();
return -1;//向发送数据失败
}
listenerRun=FALSE;
DWORD dwExitCode;
::GetExitCodeThread(pThread->m_hThread,&dwExitCode);
pThread=null;
closesocket(sServer);
closesocket(sClient);
closesocket(sHost);
WSACleanup();

这一句运行到了吗?
ShowMessage("123");

看看SQL语句有没有错:
sCheck="Select * from UserInfo where UserName = '" + rUserName + "' and PassWord = '"+rPassWord+"' ";

另外 如果需要,应该把 TCustomWinSocket *Socket 传入到函数 HandleReceive中使用。


古城区13589051525: C++ Builder ServerSocket -
豆卢世复方: 这个问题,如果是在单线程中,应该是不会出现这样的情况的.ServerSocket1ClientConnect事件,是在第一次连接的时候产生的,每建立一个新连接就会产生一个.在这之前会先触发 AcceptServerSocket1事件.当连接建立好后,客户端发送数据.在服务端的ServerSocket1ClientRead事件中是可以捕捉得到的.1,建立连接2,发送数据3,关闭连接

古城区13589051525: 使用C++ builder实现进程间的通信 -
豆卢世复方: 进程间通信 IPC 最简的方式,用文件嘛,一个写,一个轮着读 最经典方式是用 管道 或 消息 最常用方式是用 Unix Socket 最灵活方式是用 Socket 即 走TCP/IP 不但可以实现进程间通信,可以跨主机进行通信 最架构的方式是用 D-Bus IPC框架

古城区13589051525: C++builder ServerSocket和ClientSocket控件的使用问题 -
豆卢世复方: OnClientReadOccurs when the server socket should read information from a client socket.当对方client有数据来时触发.(非阻塞重点)OnClientWriteOccurs when the server socket should write information to a client socket.当你向对方发数...

古城区13589051525: C++ Builder 为什么没有Tserversocket控件 -
豆卢世复方: 默认情况下TClientSocket、TServerSocket这两个控件是没有安装到控件面板上,需要手动安装:Component-->Install packages-->Add 找到$(BDS)\Bin\dclsockets140.bpl,这个文件,点击"OK".在INTERNET组件组中出现这两个控件.

古城区13589051525: c++builder中有没有拆分字符串函数 -
豆卢世复方: C/C++中有strtok()其函数实现上述的功能: /* strtok example */ #include #include int main () { char str[] = "aaa bbb ccc ddd eee fff"; const char * split = " "; char * p; p = strtok (str,split); while(p!=NULL) { printf ("%s\n",p);...

古城区13589051525: 请问C++Builder 中怎样实现serversocket向客户端的clientsocket传送消息 -
豆卢世复方: 你要先用客户端向服务器端发送连接请求,连接成功了之后才可以发送接收数据!

古城区13589051525: C++Builder TSocketServer控件用法
豆卢世复方: 客户端的IP会是一定的,所以,可以抓客户端的IP.在ServerSocket的ClientRead事件中可以有以下代码: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { //当作为客户器一端读来自服务器一...

古城区13589051525: Socket通信能不能发送文件 -
豆卢世复方: 当然可以咯,socket是套接字,运行在网络层(IP)以及传输层上,显然是可以传输文件的咯,应用层使用的各种TCP,FTP,UDP服务均可封装在套接字之上,所以显然是可以的咯.

古城区13589051525: c++下socket应用程序编程疑惑求助!
豆卢世复方: C++最大的特点是面向对象,这个几乎就是C++立足之本.你可以把服务器抽象成一个类,通过继承,多态等等方式可以很好的封装数据以及实现功能~按照你的叙述你还是在用C的思想设计C++的程序,这样体现不出C++的优越性.你可以全局变量的方式实现这个功能,但我还是建议你用类的方式抽象.

古城区13589051525: 关于c++ builder中怎么用定时器 -
豆卢世复方: 不同版本的 C++ Builder具体操作有不同.简单的主要做法:1、新建一个默认的带win窗体的工程,并保证它能正常编译运行.2、去控件中找到Timer控件,拖出来放到窗体上.3、在窗体上点中Timer控件,属性页里,找到interval属性,填入要定时的时长(毫秒为单位),比如填10000(10秒).4、双击控件,在里面填写控件定时到了的时候要进行的动作.比如填最简单的ShowMessage("AA").5、相关的工作就做完了,编译运行,程序起动后,每10秒就会弹出一个窗,上面提示 “AA” .

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网