zoukankan      html  css  js  c++  java
  • 基于UDP的IP对IP的客户端程序

    #include "stdafx.h"
    #include<winsock2.h>
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include <Ws2tcpip.h>
    #include<WinSock2.h>
    using namespace std;
    #pragma comment(lib,"ws2_32.lib")
    # define BUFFER_SIZE 10240 //缓冲区大小


    int main() {
    SOCKET sock_Client; //客户端用于通信的Socket
    WSADATA WSAData;
    char receBuf[BUFFER_SIZE]; //发送数据的缓冲区
    char sendBuf[BUFFER_SIZE]; //接受数据的缓冲区

    if (WSAStartup(MAKEWORD(2,2), &WSAData) != 0) {
    printf("初始化失败!");
    return -1;
    }

    /*if (LOBYTE(WSAData.wVersion) != 1 || HIBYTE(WSAData.wVersion) != 1) {
    WSACleanup();
    return -1;
    }*/

    //初始化
    //sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//创建客户端用于通信的Socket

    SOCKADDR_IN addr_server; //服务器的地址数据结构
    addr_server.sin_family = AF_INET;
    addr_server.sin_port = htons(15533);//端口号
    addr_server.sin_addr.S_un.S_addr = inet_addr("192.168.0.2"); //192.168.0.3为本电脑IP地址
    //addr_server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);


    sock_Client = socket(AF_INET, SOCK_DGRAM, 0);
    ;
    if (sock_Client == INVALID_SOCKET)
    {
    printf("socket()failed:%d ", WSAGetLastError());
    return -1;
    }
    int iLen = sizeof(addr_server);

    sockaddr fromAddr;
    int addrLen = sizeof(fromAddr);
    while (1)
    {
    //printf("请输入传送的数据:");
    //gets(sendBuf);
    cout << "请输入要传送的数据:";
    cin >> sendBuf;
    int last = sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server,iLen);
    if (last == SOCKET_ERROR)
    {

    printf("socket()failed:%d ", WSAGetLastError());
    return -1;
    }
    else if (last == 0)
    {
    return -1;
    }
    else
    {
    printf("sendto()succeeded. ");

    }
    //receBuf[BUFFER_SIZE] = { 0 };
    memset(receBuf, 0, BUFFER_SIZE);
    int strLen = recvfrom(sock_Client, receBuf, BUFFER_SIZE, 0, &fromAddr, &addrLen);
    if (strLen > 0) {
    receBuf[strLen]= ''; //给字符数组加一个'',表示结束了。不然输出有乱码
    printf("接收到数据: ");
    for (int i=0;i < strLen; i++)
    {
    printf("%02x ",receBuf[i]&0xff);
    if ((i + 1) % 4 == 0)
    {
    printf(" ");
    }
    }
    }
    else
    {
    printf("未接收到数据 ");

    }

    }
    closesocket(sock_Client);
    WSACleanup();
    return 0;
    }

    /*
    sockaddr和sockaddr_in的区别:
    sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。
    而sockaddr_in 是internet环境下套接字的地址形式。
    所以在网络编程中我们会对sockaddr_in结构体进行操作。
    使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。

    服务器端比较常见,点对点的接收只接收特定端口和IP的数据,当接收到指定客户端的数据时做相应的响应,发数据给客户端。
    */

  • 相关阅读:
    java中原子操作的实现分析
    AQS源码分析
    Java JNDI 学习
    门面模式、代理模式、适配器模式的区别
    tomcat源码阅读之StandardWrapper解析
    tomcat源码阅读之过滤器
    tomcat源码阅读之SingleThreadModel
    tomcat源码阅读之单点登录
    技术人员的八条宝贵经验,时刻提醒自己,共勉之
    tomcat源码阅读之安全机制
  • 原文地址:https://www.cnblogs.com/xinshuwei/p/9202209.html
Copyright © 2011-2022 走看看