socket编程(1)简单的TCP/UDP编程

简介:

socket编程是一种与底层网络协议无关的编程方式,socket意味一种插口,即一个地址配上一个端口就构成了一端插口,既然他与底层协议无关,所以我们在使用socket 编程的时候,就可以任意选用哪种网络协议,如最流行的tcp/ip协议。

在所有socket编程前腰包含头文件<WinSock2.h>

下面是基于连接的tcp编程方法:

服务器端:服务器端是指在tcp中进行监听,也就是被动连接的那一端,服务器端在于客户端建立好连接后,可以同服务器端发送和接收信息,他用一个监听socket进行监听客户端连接,然后得到连接后可以创建一个通信socket进行通信,可以同时与多个客户端通信,服务器端的编程主要有以下几步:

1.初始winsocket

WSAStartup(MAKEWORD(2,2),&wsad);

2.建立一个用于监听的socket
    listenSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);

3.设定监听socket的地址端口,并绑定给这个socket

    listenAddr.sin_family=AF_INET;
    listenAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    listenAddr.sin_port=htons(11111);

    if(bind(listenSocket,(SOCKADDR *)(&listenAddr),sizeof(listenAddr))==SOCKET_ERROR){
        abort();
        return;
    }

4.进行监听  

if(listen(listenSocket,1)==SOCKET_ERROR){
        abort();
    }

5.循环等待新连接进入的socket,如果等到则创建一个socket与之通信,accept操作是一个阻塞的操作。

    while(!stopped){
        acceptSocket=WSAAccept(listenSocket,(SOCKADDR*)(&clientAddr),&clientAddrSize,0,0);
        if(acceptSocket==INVALID_SOCKET){
            int code=WSAGetLastError();
            break;
        }

//这里可以得到接入的socket的地址端口
        char* add=inet_ntoa(clientAddr.sin_addr);
        int port=ntohs(clientAddr.sin_port);
//   acceptSocket就是一个已经于客户端连接上的可以进行通信的socket,这里 要 启用一个 新线程用acceptSocket阈值通信

}

}

6、在启用的新线程中一般是这样的:

调用recv或send函数接收和发送信息

   ret=recv(acceptSocket,buf,1000,0);

在线程结束前要关闭这个socket
  closesocket(acceptSocket);

7关闭服务器

首先关闭监听的socket

closesocket(listenSocket);

然后清理winsocket
WSACleanup();

**************************************************************************************

客户端:客户端socket是进行主动连接的那一方,客户端的编程通常是这样的:

1.初始winsocket

WSAStartup(MAKEWORD(2,2),&wsad);

2.建立一个用于连接的socket


    csocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);

3.设定监听socket的地址端口,并绑定给这个socket

    caddres.sin_family=AF_INET;
    caddres.sin_addr.s_addr=inet_addr("127.0.0.1");
    caddres.sin_port=htons(11111);

4、想某个服务器发送连接
    if(WSAConnect(csocket,(SOCKADDR*)(&caddres),sizeof(caddres),0,0,0,0)==SOCKET_ERROR){
        abort();
        return;
    }

5调用recv或send函数接收和发送信息

6通信结束后关闭

closesocket();
   WSACleanup();

************************************************************************************

send和recv的一些方法:

send()函数不保证会把send的内容全部send出去,这样就可能要多次send(),常用的方法是

int totalbyte=data.size();
    DWORD ret;
    WSABUF sendBuf;
    sendBuf.len=totalbyte;
    sendBuf.buf=data;
    while(totalbyte>0){
        if(WSASend(csocket,&sendBuf,1,&ret,0,0,0)==SOCKET_ERROR){
            abort();
            return;
        }
        totalbyte-=ret;
        sendBuf.len=totalbyte;
        sendBuf.buf+=ret;
    }

*******************************************************************************************

下面是基于无连接的UDP编程方法

这使用的是无连接的协议,TCP是有连接的,即要求在连接之前需要服务器端和客户端都绑定端口,然后连接后可以双向发送接收。

但是无连接的协议只需要服务器端绑定端口,而客户端不需要,客户端只需要向服务器端的监听端口发送消息就可以了,也只能由客户端向服务器端发送消息。程序的实现如下;

服务器端

1.初始化

WSAStartup(MAKEWORD(2,2),&wsad);

2.创建用于监听的socket
    s=socket(AF_INET,SOCK_DGRAM,0);

3.绑定一个地址端口
    SOCKADDR_IN udpAdress,sender;
    int senferAddSize=sizeof(sender);
    udpAdress.sin_family=AF_INET;
    udpAdress.sin_port=htons(11112);
    udpAdress.sin_addr.s_addr=inet_addr("127.0.0.1");
    bind(s,(SOCKADDR*)&udpAdress,sizeof(udpAdress));

4.就可以调用recvfrom这个无连接的的接收函数接收数据,这个函数是阻塞的。无连接的协议不保证数据传输的可靠性,而且一次传输的数据量是有限的
    ret=recvfrom(s,data,1000,0,(SOCKADDR*)&sender,&senferAddSize);

5.结束后关闭socket和清理

客户端

1.初始化

WSAStartup(MAKEWORD(2,2),&wsad);

2.创建一个socket,但是不用绑定端口
    usocket=socket(AF_INET,SOCK_DGRAM,0);

3.使用无连接的发送函数sendto向指定地址发送数据
      sendto(usocket,data(),totalbyte,0,(SOCKADDR*)&dstAdd,dstAddrSize);

4.关闭、清理
    closesocket(usocket);
    WSACleanup();

目录
相关文章
|
11月前
|
网络协议 安全 网络安全
什么是TCP/UDP/HTTP?它们如何影响你的内网穿透体验?
数据的传输离不开各种协议,它们就像现实世界中的交通规则,规定了数据如何打包、寻址、传输和接收。对于使用内网穿透的用户来说,理解TCP、UDP和HTTP这些基础协议的特点,能帮助你更好地理解其性能表现,并选择最适合的配置方案。
|
网络协议 API
区分TCP/IP、HTTP、Socket三者的差异
HTTP关注于应用层的协议规范,而Socket关注于为应用程序提供编程中的网络功能,这些功能本身是建立在底层的TCP/IP协议之上;HTTP是更高层次的抽象,定义了如何包装数据,而TCP/IP定义了如何传送数据,Socket则是两者之间在程序中的桥梁,负责实现细节。在实际应用中,通常HTTP通信也是通过Socket来完成,因为HTTP仅是具体内容的封装形式,而Socket则是传送方式的实现形式。
1122 16
|
网络协议 安全 网络安全
详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
766 2
|
网络协议 Java 开发工具
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
828 1
|
网络协议 算法 网络性能优化
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。
|
存储 网络协议 安全
用于 syslog 收集的协议:TCP、UDP、RELP
系统日志是从Linux/Unix设备及网络设备生成的日志,可通过syslog服务器集中管理。日志传输支持UDP、TCP和RELP协议。UDP无连接且不可靠,不推荐使用;TCP可靠,常用于rsyslog和syslog-ng;RELP提供可靠传输和反向确认。集中管理日志有助于故障排除和安全审计,EventLog Analyzer等工具可自动收集、解析和分析日志。
1440 2
|
网络协议 网络性能优化 数据处理
深入解析:TCP与UDP的核心技术差异
在网络通信的世界里,TCP(传输控制协议)和UDP(用户数据报协议)是两种核心的传输层协议,它们在确保数据传输的可靠性、效率和实时性方面扮演着不同的角色。本文将深入探讨这两种协议的技术差异,并探讨它们在不同应用场景下的适用性。
718 4
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
1031 3
|
缓存 负载均衡 网络协议
面试:TCP、UDP如何解决丢包问题
TCP、UDP如何解决丢包问题。TCP:基于数据块传输/数据分片、对失序数据包重新排序以及去重、流量控制(滑动窗口)、拥塞控制、自主重传ARQ;UDP:程序执行后马上开始监听、控制报文大小、每个分割块的长度小于MTU