Sunshine Alike

半完美主义

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  35 Posts :: 1 Stories :: 56 Comments :: 0 Trackbacks

常用链接

留言簿(15)

积分与排名

  • 积分 - 49747
  • 排名 - 451

最新随笔

最新评论

好久没来写点东西,最近鬼事还真是多,破项目搞的人烦死。带队的经理说给我们的要求是日代码100行(核心代码),懒了这么久,一下写起来还真是累啊!
最近来了点劲头,先写上练的几个例子

使用windows套接字的网络小程序-------------------

1.Socket基本操作
 (1)启动/终止
     winsock在被调用时以动态链接库的形式实现,所以在它初始化时应首先调用WSAStartup函数进行初始化,同时确定被调用的winsock版本号等。
    //  加载套接字库
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested 
= MAKEWORD( 11 );

    
int err = WSAStartup( wVersionRequested, &wsaData );
    
if ( err != 0 ) {
        
/* Tell the user that we could not find a usable */
        
/* WinSock DLL.                                  */
        
return false;
    }

    
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) 
!= 1 ) {
            
/* Tell the user that we could not find a usable */
            
/* WinSock DLL.                                  */
            WSACleanup( );
            
return false
这里加载了1.1版本的socket。在网络通信完成后,需要使用函数WSACleanup释放资源。
 (2)创建与绑定
  套接字的创建非常简单,只需要调用socket即可。如下:
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);//流式,TCP
  SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);//数据报,UDP

  使用bind函数可以将一个套接字绑定到一个地址上
  int bind(SOCKET sock, const struct sockaddr* name, int len);//sockaddr是一个用来表示地
  址信息的结构
 (3)侦听,接受连接与连接
  listen, accept, connect这三个函数用于建立通信的连接。
  int listen(SOCKET sock, int backlog);//scok必须是一个已经绑定但是没有连接的套接字,
  backlog用于设定最大可以等待的连接长度
  成功调用listen函数后,就可以接受客户机的连接了。
  SOCKET accept(SOCKET sock, struct sockaddr* addr, int* addrlen);
  到此一切就绪,当客户机想到连接时可以使用connect进行连接。
 (4)发送,连接
  用于TCP的:
  int send(SOCKET sock, const char* buf, int len, int flags);
    int recv(SOCKET sock, char* buf, int len, int flags);
  用于UDP的:
  int sendto(SOCKET sock, const char* buf, int len, int flags,
              const struct sockaddr* to, int tolen);
    int recvfrom(SOCKET sock, char* buf, int len, int flags,
               struct sockaddr* from, int formlen);

2.示例
 两个win32的控制台程序,一个TcpSer,一个TcpClient。
 为了使用socket需要包含头文件<Winsock2.h>
 
 TcpSer:
 
#include <Winsock2.h>
#include 
<iostream>
#include 
<string>
using namespace std;

void main()
{
    
//加载套接字库,版本1.1
    WORD wVersionRequested;
    WSADATA wsaData;
    
int err;

    wVersionRequested 
= MAKEWORD( 11 );

    err 
= WSAStartup( wVersionRequested, &wsaData );
    
if ( err != 0 ) {
        
/* Tell the user that we could not find a usable */
        
/* WinSock DLL.                                  */
        
return;
    }

    
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) 
!= 1 ) {
            
/* Tell the user that we could not find a usable */
            
/* WinSock DLL.                                  */
            WSACleanup( );
            
return
    }
    
    
//创建套接字
    SOCKET sockSer = socket(AF_INET, SOCK_STREAM, 0);
   
//地址结构体
    SOCKADDR_IN addrSer;
    addrSer.sin_addr.S_un.S_addr  
= htonl(INADDR_ANY);
    addrSer.sin_family 
= AF_INET;
    addrSer.sin_port 
= htons(6000);
   
//绑定与监听
    bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));
    listen(sockSer, 
5);
    cout
<<"Tcp Server Run!"<<endl;

    SOCKADDR_IN addrClient;
    
int len = sizeof(SOCKADDR);
  //收到连接请求,创建一个新socket用于保持连接
    SOCKET sockCon = accept(sockSer, (SOCKADDR*)&addrClient, &len);
    
while(true)
    {
        
char recBuf[100];
        recv(sockCon, recBuf, 
1000);
        cout
<<"message form clinet : "<<recBuf<<endl;
    }
    //清理工作
    closesocket(sockSer);
    WSACleanup();

}

 TcpClient:
#include <Winsock2.h>
#include 
<iostream>
#include 
<string>
using namespace std;

void main()
{
    
//加载套接字库
    WORD wVersionRequested;
    WSADATA wsaData;
    
int err;

    wVersionRequested 
= MAKEWORD( 11 );

    err 
= WSAStartup( wVersionRequested, &wsaData );
    
if ( err != 0 ) {
        
/* Tell the user that we could not find a usable */
        
/* WinSock DLL.                                  */
        
return;
    }

    
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) 
!= 1 ) {
            
/* Tell the user that we could not find a usable */
            
/* WinSock DLL.                                  */
            WSACleanup( );
            
return
    }
    
    
//创建套接字
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
    
    SOCKADDR_IN addrSer;
    addrSer.sin_addr.S_un.S_addr  
= inet_addr("127.0.0.1");
    addrSer.sin_family 
= AF_INET;
    addrSer.sin_port 
= htons(6000);

    cout
<<"enter your message: ";
    
string sendBuf;
    
while(cin>>sendBuf)
    {
        
if(sendBuf == "q" || sendBuf == "Q")
            
break;
        
//连接服务器
        connect(sockClient, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));
        send(sockClient, sendBuf.c_str(), sendBuf.length()
+10);
        cout
<<"enter your message: ";
    }

    
//清理工作
    closesocket(sockClient);
    WSACleanup();
}

最后还要注意的就是:
在VS下编译时还要在项目属性>配置属性>链接器>命令行里加入附加选项ws2_32.lib
否则链接的时候找不到与socket相关的函数

posted on 2009-04-17 09:44 Sunshine Alike 阅读(377) 评论(2)  编辑 收藏 引用 所属分类: WinAPI应用程序

Feedback

# re: WinSocketTest 1.0 2009-04-19 09:09 zhoubaozhong
牛人啊!现在在工作了吗?大学毕业了?  回复  更多评论
  

# re: WinSocketTest 1.0 2009-04-26 10:38 Pencil.C++
板凳,看看。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理