socket UDP网络程序编写

来源:互联网 发布:淘宝买家秀活动封面 编辑:程序博客网 时间:2024/05/22 14:32

UDP网络程序编写

基于UDP(面向无连接)的socket编程

服务器(接收端)程序

1. 创建套接字(socket)

2. 将套接字绑定到一个本地地址和端口上(bind)

3. 等待接收数据(recvfrom)

4. 关闭套接字

客户端(发送端)程序

1. 创建套接字(socket)

2. 向服务器端发送数据(sendto)

3. 关闭套接字

 

控制台程序在使用之前须链接库数:工程->设置->Link->输入ws2_32.lib

控制台UDP服务器端收发消息

#include <Winsock2.h>

#include <stdio.h>

void main()

{

       WORD wVersionRequested;

       WSADATA wsaData;

       int err;

       wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1

//1.加载套接字库版本协商MSDN上有这个源码 

       err = WSAStartup( wVersionRequested, &wsaData );

       if ( err != 0 )

       {

              return;

       }

//判断是否我们请求的winsocket版本,如果不是清除SOCKET后退出

       if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )

       {

              WSACleanup( );

              return;

       }

//2.创建套接字-----------SOCK_DGRAM数据报UDP

       SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);

       SOCKADDR_IN addrSrv;

       addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

       addrSrv.sin_family = AF_INET;

       addrSrv.sin_port = htons(6000);

//3.服务器端绑定

       bind (sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

       //申请变量

       char recvBuf[100];

       char sendBuf[100];

       char tempBuf[100];

       SOCKADDR_IN addrClient;

       int len = sizeof(SOCKADDR);

 

         //服务器端循环接收

       while(1)

       {

              recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);

              if('#'==recvBuf[0])

              {

                     //表示客户端想要退出

                     sendto(sockSrv,"#",strlen("#")+1,0,(SOCKADDR*)&addrClient,len);

                     printf("Chat end!/n");

                     break;

              }

              sprintf(tempBuf,"%s say: %s", inet_ntoa(addrClient.sin_addr),recvBuf);

              printf("%s/n",tempBuf);

              printf("Please input data:/n");

              //发送消息

              gets(sendBuf);//可以得到一行数据

sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);  }

       closesocket(sockSrv);

       WSACleanup();

}

 控制台UDP客户端接收消息

#include <Winsock2.h>

#include <stdio.h>

void main()

{

       WORD wVersionRequested;

       WSADATA wsaData;

       int err;

       wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1

//1.加载套接字库版本协商MSDN上有这个源码

       err = WSAStartup( wVersionRequested, &wsaData );

       if ( err != 0 )

       {

              return;

       }

       //判断是否我们请求的winsocket版本,如果不是清除SOCKET后退出

       if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )

       {

              WSACleanup( );

              return;

       }

      

//2.创建套接字-----------SOCK_DGRAM数据报UDP

       SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);

//3.填充结构体

       SOCKADDR_IN addrSrv;

       addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服务器地址

       addrSrv.sin_family = AF_INET;

       addrSrv.sin_port = htons(6000);

       //申请变量

       char recvBuf[100];

       char sendBuf[100];

       char tempBuf[200];

       int len = sizeof(SOCKADDR);

 

    //客户端循环接收

       while (1)

       {

              //提示用户输入信息

              printf("Please input data:/n");

              gets(sendBuf);

              //向服务器端发送消息

              sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);

              recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*) &addrSrv,&len);

              if('#' ==recvBuf[0])

              {

                     //如果用户输入#终止套接字并向客户端发送消息

                     sendto(sockClient,"#",strlen("#")+1,0,(SOCKADDR*) &addrSrv,len);

                     printf("chat end!/n");

                     break;

              }

              //客户端显示发送内容

              sprintf(tempBuf,"%s say: %s",inet_ntoa(addrSrv.sin_addr),recvBuf);

              printf("%s/n",tempBuf);

             

       }    

       //关闭套接字

       closesocket(sockClient);

       WSACleanup();

}

原创粉丝点击