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

来源:互联网 发布:java基本功编程题 编辑:程序博客网 时间:2024/05/23 20:11

说明:

本程序是基于windows socket的套接字库实现网络编程;
当WSAStartup函数调用成功后,在程序的最后都需要相应的调用WSACleanup函数
以便释放为该应用程序分配的资源,终止对WinSock动态库的使用。

基于UDP的服务器端流程

  1. 创建套接字(socket)
  2. 将套接字和IP地址、端口号绑定在一起(bind)
  3. 等待客户端发起数据通信(recvfrom/recvto)
  4. 关闭套接字

基于UDP的客户端流程

  1. 创建套接字(socket)
  2. 向服务器发起通信(recvfrom/recvto)
  3. 关闭套接字

基于UDP的socket编程流程图

基于UDP的socket编程不需要设置监听和发起/接收请求,可以直接相互通信,流程如下:
这里写图片描述

服务器端代码:

#include "stdafx.h"#include <Winsock2.h>int _tmain(int argc, _TCHAR* argv[]){    WORD dwVersionReq = MAKEWORD(1,1);    WSAData wsData = {0};    //加载套接字库    if (0 != WSAStartup(dwVersionReq,&wsData))    {        WSACleanup();        return 0;    }    //socket版本确认    if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion != 1))    {        WSACleanup();        return 0;    }    //创建服务套接字    SOCKET socketSrv = socket(AF_INET,SOCK_DGRAM,0/*自动选择协议*/);    //对socket绑定端口号和IP地址    SOCKADDR_IN addrServer;    addrServer.sin_family = AF_INET;    addrServer.sin_port = htons(6000);    addrServer.sin_addr.S_un.S_addr = htonl(ADDR_ANY);    bind(socketSrv,(SOCKADDR*)&addrServer,sizeof(addrServer));    //保存client端socket信息    SOCKADDR_IN addClient;    int len = sizeof(SOCKADDR_IN);    while (1)    {        //等待并接收数据        char szBuffer[100] = {0};        recvfrom(socketSrv,szBuffer,100,0,(SOCKADDR*)&addClient,&len);        printf("client->server:%s\n",szBuffer);        //发送数据        char szSendBuf[100] = "this is server";        sendto(socketSrv, szSendBuf, 100,0,(SOCKADDR*)&addClient,len);    }    //关闭套接字    closesocket(socketSrv);    //关闭winsocket库    WSACleanup();    system("pause");    return 0;}

客户端代码:

#include "stdafx.h"#include <Winsock2.h>int _tmain(int argc, _TCHAR* argv[]){    //指定wind socket版本    WORD dwVersionReq = MAKEWORD(1,1);    WSAData wsData = {0};    //加载套接字库dll    if (0 != WSAStartup(dwVersionReq,&wsData))    {        WSACleanup();        return 0;    }    //版本判断    if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion != 1))    {        WSACleanup();        return 0;    }    //创建套接字    SOCKET socketClient = socket(AF_INET,SOCK_DGRAM,0);    //填充服务器socket信息    SOCKADDR_IN addrServer;    int nLength = sizeof(addrServer);    addrServer.sin_family = AF_INET;    //服务器的应用程序端口    addrServer.sin_port = htons(6000);    //服务器的IP地址,同一台电脑就是本地IP    addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");    //发送数据    char szClientBuf[100]= "this is client";    sendto(socketClient,szClientBuf,100,0,(SOCKADDR*)&addrServer,nLength);    //介绍数据    char szRecvBuf[100] = {0};    recvfrom(socketClient,szRecvBuf,100,0,(SOCKADDR*)&addrServer,&nLength);    printf("server->client:%s\n", szRecvBuf);    //关闭套接字    closesocket(socketClient);    //关闭winsocket库    WSACleanup();    system("pause");    return 0;}

测试效果:

这里写图片描述

1 0
原创粉丝点击