网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.链表的c语言实现(七).
.利用 C++Builder 定制系统菜单.
.在CB中进行DirectX编程(1).
.如何在C/C++中调用Java.
.根据接受的数字在控制台打印出各.
.C例题讲解.
.C++ 类型转换.
.大中小车拉货的问题.
.怎样将C语言声明转换为VB声明.
.入门教程:实例详解C++友元.
.新设想——VC开发多语言界面支持.
.程序设计语言.
.自定义控件(可以动态加载用户控件.
.C++ 和 Delphi 的函数覆盖(Overr.
.C语言的数据类型.
.Web中DataGrid绑定数据显示列可拖.
.使用CommaText.
.Processes (进程).
.C语言链表的创建与排序.
.怎样使用资源文件.

在CB中用socket api来写网络通讯程序

发表日期:2008-3-8



  本文转自csdn,作者:kingcaiyao
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
原文:  http://www.csdn.net/develop/read_article.ASP?id=19883


在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
Socket api Client:

#ifndef UDPClientH
#define UDPClientH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <stdio.h>
#include "CCEdit.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;
   TCCEdit *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


.cpp File

#include <vcl.h>
#pragma hdrstop
#include "UDPClient.h"
#include "WinSock.h"
#pragma package(smart_init)
#pragma link "CCEdit"
#pragma resource "*.dfm"
TLANForm *LANForm;
enum PROTO {TCP=0,UDP=1};
SOCKET m_Socket=INVALID_SOCKET;
PROTO m_Protocol=TCP;
__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)
{
   char buf[4096];
   int nLen;
   strUCt sockaddr_in from;

   int 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];
   int nSize=0;
   UINT m_Port;
   AnsiString addr;
   addr=Addr->Text.Trim();
   if(addr.IsEmpty()){
      ::MessageBox(0,"Please enter the server IP!","Error",MB_OK+MB_ICONERROR);

      return;
   }
   unsigned long nAddr=inet_addr(addr.c_str());
   if(nAddr==INADDR_NONE){
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
      return;}

   try
   {
      m_Port=Port->Text.ToInt();
   }
   catch(Exception &e)
   {
      ::MessageBox(0,e.Message.c_str(),"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,"Please enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
      return;}

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

   //OBTain the active connection
   char ComputerName[255];
   gethostname(ComputerName,255);
   struct hostent* he=gethostbyname(ComputerName);
上一篇:在CB环境中实现在菜单中显示历史文件列表 人气:345
下一篇:在CB中使用ActiveX控件显示Flash动画 人气:720
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐