C++基于TCP和UDP的socket通信

以下是关于socket编程的一个非常经典的例子:

服务端:

#include <stdio.h>
#include <Winsock2.h> //windows socket的头文件

#pragma comment( lib, "ws2_32.lib" )// 链接Winsock2.h的静态库文件

void main()
{
    //初始化winsocket
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节

    err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
    if ( err != 0 )
    {
        return;
    }

    if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容
    {
        WSACleanup( );
        return;
    }

    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);    //htonl用来将主机字节顺序转换为网络字节顺序(to network long)
    //INADDR_ANY就是指定地址为0.0.0.0的地址,
    //表示不确定地址,或“任意地址”。”
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(4000);//htons用来将主机字节顺序转换为网络字节顺序(to network short)

    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将本地地址绑定到所创建的socket上,以使在网络上标识该socket

    listen(sockSrv,5);//socket监听,准备接受连接请求。

    SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);

    while(1)
    {
        SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//为一个连接请求提供服务。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接

        char sendBuf[50];
        sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//inet_ntoa网络地址转换转点分十进制的字符串指针
        send(sockConn,sendBuf,strlen(sendBuf)+1,0);

        char recvBuf[50];
        recv(sockConn,recvBuf,50,0);
        printf("%s\n",recvBuf);

        closesocket(sockConn);
        Sleep(2000);//2000毫秒
    }
    WSACleanup();
}

客户端:

#include <stdio.h>
#include <Winsock2.h>

#pragma comment( lib, "ws2_32.lib" ) 

void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节

    err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
    if ( err != 0 )
    {
        return;
    }

    if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容
    {
        WSACleanup( );
        return;
    }
    for(int index=0;;index++)
    {
        SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

        SOCKADDR_IN addrClt;//需要包含服务端IP信息
        addrClt.sin_addr.S_un.S_addr=inet_addr("192.168.0.30");// inet_addr将IP地址从点数格式转换成网络字节格式整型。
        addrClt.sin_family=AF_INET;
        addrClt.sin_port=htons(4000);

        connect(sockClient,(SOCKADDR*)&addrClt,sizeof(SOCKADDR));//客户机向服务器发出连接请求
        char recvBuf[50];
        recv(sockClient,recvBuf,50,0);
        printf("my reply is : %s\n",recvBuf);

        char sendBuf[50];
        sprintf(sendBuf,"%3d,",index);
        strcat(sendBuf,"server node of: yaopeng");
        send(sockClient,sendBuf,strlen(sendBuf)+1,0);

        closesocket(sockClient);
        Sleep(2000);
    }
    WSACleanup();
}
时间: 2024-12-28 02:52:56

C++基于TCP和UDP的socket通信的相关文章

TCP、UDP、Socket 通信(原)

说明:本随笔主要演示自己给自己发送消息例子,分别使用了TCP协议.UDP协议以及socket套接字通信.使用socket套接字了模拟TCP.UDP通信实现原理.其中有些源码都来自<C#高级编程 第7版>,并附加了自己的理解,有的也进行了一些简单的拓展. 第一次原创随笔,很多地方可能考虑不周或理解有误,希望大家留言指正,与大家共同进步.也希望大家不喜勿喷,给点鼓励还是比较好的~~ 闲话少说,进入主题! 一.TCP 类 TCP是基于连接的一种通信模式,我们需要创建客户端与服务器端来进行通信.在客户

基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. 1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下S

Java Socket实现基于TCP和UDP多线程通信

一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSocket类. 1.2 服务器端套路 1.创建ServerSocket对象,绑定监听端口. 2.通过accept()方法监听客户端请求. 3.连接建立后,通过输入流读取客户端发送的请求信息. 4.通过输出流向客户端发送响应信息. 5.关闭响应的资源. 1.3 客户端套路 1.创建Socket对象,指明

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

recv原理、高阶版黏包解决方案、基于UDP的socket通信

recv原理.高阶版黏包解决方案.基于UDP的socket通信 recv原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the optional flags argument, see the Unix manual. 对于这些设置的参数,可以查看Unix手册. When no data is available, block untilat least one byte is av

HTTP、TCP、UDP以及SOCKET之间的区别/联系

一.TCP/IP代表传输控制协议/网际协议,指的是一系列协组. 可分为四个层次:数据链路层.网络层.传输层和应用层. 在网络层:有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层:中有TCP协议与UDP协议. 在应用层:有FTP.HTTP.TELNET.SMTP.DNS等协议. TCP和UDP使用IP协议从一个网络传送数据包到另一个网络.把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口.TCP和UDP是高速公路上的"卡车",它们携带的

JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NIO可以实现非阻塞IO, 这样就可以使用一个线程处理所有的客户请求. 基于NIO的非阻塞Socket通信 服务器将用来监听客户端请求的channel注册到selector上,启动一个线程,使用selector的select()获取求情的客户端的channel数量, 当监听到有客户端请求时,就通过Sel

计算机网络——网页上(或其他情况下)的视频传输是基于TCP还是UDP

计算机网络——网页上(或其他情况下)的视频传输是基于TCP还是UDP 1. 综述 链接:百度知道 当然,需要清楚,这里说基于TCP还是UDP是在传输层,应用层的协议估计种类多多. 总结找到的内容,应该说: 1. 网页上的视频是基于HTTP/HTTPS,传输层是TCP 2. QQ视频聊天等是基于UDP 3. 甚至有的应用使用p2p协议,传输层应该也是TCP 4. 通过http进行流化视频有很多种方法 5. 传输视频还有很多其他的应用层协议 一方面,在网页上看视频可以忍受缓冲5s看到更清楚的视频,所

TCP、UDP及Socket(Port)的关系,深入浅出!

转自http://www.cnblogs.com/wish123/archive/2013/04/12/3017031.html 提醒:貌似这里说的socket是指port,而非socket api技术!仅供参考!貌似标题命名不准确的说<更安全的Linux网络>第1章防火墙的基本概念,在本书的开始将详尽讲解与防火墙相关的TCP/IP技术.此外,对于防火墙的原理.种类.架构及其优.缺点,在本章中也都有详尽的介绍.本节为大家介绍TCP.UDP及Socket的关系.1.4 TCP.UDP及Socke