A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© quanhui 黑马帝   /  2011-11-17 12:11  /  2166 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Socket套接字底层用的是什么协议呢? 是TCP么 ? 是否可以使用UDP然后自己再封装一层作为自己的协议呢?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

2 个回复

倒序浏览
使用的是传输层的协议(TCP/IP),UDP就是发送出去就不管的一种网络协议。因此UDP编程的发送端只管发送就可以了,不用检查网络连接状态。下面用例子来说明怎样编写UDP,并会详细解释每个API和数据类型。

7.1 UDP广播发送程序
下面是一个用UDP发送广播报文的例子。

#include <winsock2.h>

#include <iostream.h>

void main()

{

    SOCKET sock;   //socket套接字

    char szMsg[] = "this is a UDP test package";//被发送的字段

    //1.启动SOCKET库,版本为2.0

    WORD wVersionRequested;

    WSADATA wsaData;

    int err;  

    wVersionRequested = MAKEWORD( 2, 0 );

    err = WSAStartup( wVersionRequested, &wsaData );

    if ( 0 != err ) //检查Socket初始化是否成功

    {

       cout<<"Socket2.0初始化失败,Exit!";

       return;

    }

    //检查Socket库的版本是否为2.0

    if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )

    {

       WSACleanup( );

       return;

    }

    //2.创建socket,

    sock = socket(

       AF_INET,           //internetwork: UDP, TCP, etc

       SOCK_DGRAM,       //SOCK_DGRAM说明是UDP类型

       0                  //protocol

       );

    if (INVALID_SOCKET == sock ) {

       cout<<"Socket创建失败,Exit!";

       return;

    }

    //3.设置该套接字为广播类型,

    bool opt = true;

    setsockopt(sock, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char FAR *>(&opt), sizeof(opt));

    //4.设置发往的地址

    sockaddr_in addrto;            //发往的地址

    memset(&addrto,0,sizeof(addrto));

    addrto.sin_family = AF_INET;               //地址类型为internetwork

    addrto.sin_addr.s_addr = INADDR_BROADCAST; //设置ip为广播地址

    addrto.sin_port = htons(7861);             //端口号为7861

    int nlen=sizeof(addrto);

    unsigned int uIndex = 1;

    while(true)

    {

       Sleep(1000); //程序休眠一秒

       //向广播地址发送消息

       if( sendto(sock, szMsg, strlen(szMsg), 0, (sockaddr*)&addrto,nlen)

           == SOCKET_ERROR )

           cout<<WSAGetLastError()<<endl;

       else

           cout<<uIndex++<<":an UDP package is sended."<<endl;

    }

    if (!closesocket(sock)) //关闭套接字

    {

       WSAGetLastError();

       return;

    }

    if (!WSACleanup())       //关闭Socket库

    {

       WSAGetLastError();

       return;

    }  

}

编译命令:

CL /c UDP_Send_Broadcast.cpp

链接命令(注意如果找不到该库,则要在后面的/LIBPATH参数后加上库的路径):

link UDP_Send_Broadcast.obj ws2_32.lib

执行命令:

D:"Code"成品代码"Socket"socket_src>UDP_Send_Broadcast.exe

1:an UDP package is sended.

2:an UDP package is sended.

3:an UDP package is sended.

4:an UDP package is sended.

^C

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
Socket应该是支持的协议,可多了,都是网络传输控制方面的协议。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马