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();

时间: 2024-09-17 03:41:30

socket编程(1)简单的TCP/UDP编程的相关文章

12篇学通C#网络编程——第四篇 TCP应用编程

 年底了,人浮躁多了,沉不下去心研究技术了,不过昨天终于抢到了回家的票,很开心.     言归正卷,在WCF出来之后,可能我们玩这些原始的TCP越来越少了,我们知道WCF对TCP进行了再一次的包装,第一反应给我们的或许是 同构系统用TCP,异构系统用HTTP,那么问题来了,异构系统到底可不可以用TCP呢?至少WCF是玩不了的,因为其他语言没有针对.net的"服务 引用",也没有什么ChannelFactory给你去玩,如果你是一定要追求性能的话,原始的TCP会助你一臂之力的.    我

iOS Socket编程-C语言版(UDP)

iOS Socket编程-C语言版(UDP) 本篇文章为总结使用C语言的api来完成UDP通信的基本功能,如果您对Socket不了解,请先阅读上一篇理论知识: iOS Socket理论知识 如果文章中有任何您认为不正确的或者有疑问的,请联系笔者! 谢谢! 支持原创,请阅读原文 1. UDP Socket编程 先讲一讲UDP编程,因为比TCP要简单多了.首先,我们需要明白UDP是用户数据报协议,英文名为User Datagram Protocol,它是面向无连接的. 注意:Socket通信一定有要

Socket编程 (连接,发送消息) (Tcp、Udp) - Part1

原文 http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html Socket编程 (连接,发送消息) (Tcp.Udp)  本篇文章主要实现Socket在Tcp\Udp协议下相互通讯的方式.(服务器端与客户端的通讯) 1.基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息. 使用Tcp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) (2).绑定服

Android编程实现简单的UDP Client实例_Android

本文实例讲述了Android编程实现简单的UDP Client.分享给大家供大家参考,具体如下: 该代码在4.2.2内调试通过 1.记得加权限 <uses-permission android:name="android.permission.INTERNET"/> 注意:Android 4.0之后,就不能在主线程进行socket通信,否则会抛异常. 2.代码 MainActivity.java: package mao.example.quicksend; import

Socket编程 (异步通讯,解决Tcp粘包) - Part3

原文 http://www.cnblogs.com/zengqinglei/archive/2013/05/14/3078842.html Socket编程 (异步通讯,解决Tcp粘包) 从上一章的通讯中,我们发现如果使用Tcp连续发送消息会出现消息一起发送过来的情况,这样给我们编程造成一定的问题,给我们的信息解析造成一定的问题.那么这篇文章就将针对以上问题给出解决方案......   问题一般会出现的情况如下,假设我们连续发送两条两天记录("我是liger_zql"): 模拟发送示例

Android编程实现简单的UDP Client实例

本文实例讲述了Android编程实现简单的UDP Client.分享给大家供大家参考,具体如下: 该代码在4.2.2内调试通过 1.记得加权限 <uses-permission android:name="android.permission.INTERNET"/> 注意:Android 4.0之后,就不能在主线程进行socket通信,否则会抛异常. 2.代码 MainActivity.java: package mao.example.quicksend; import

数据包-在win7中使用socket UDP 编程时,数据发送不出来

问题描述 在win7中使用socket UDP 编程时,数据发送不出来 各位大哥大姐,我在使用 socket 做 UDP编程时,遇到一个非常奇怪的问题 1,在win7下使用 sendto 函数发送数据时,sendto函数的返回值正常,但是有时候没有数据发送出来(抓不到数据包),但是当拔掉网线,重插一下就有数据了,但是待会儿就又没有了(这个不是网线接触不好,因为电脑上网一直正常) 2,同样程序,在XP系统里没有问题 求高手指点,感激不尽!!!!!

请问,TCP、UDP编程,同步、异步

问题描述 我准备学WCF,学之前,需要学<c#网络编程>有两个问题:1:TCP面向连接编程.UDP无连接编程,哪个用得多些?2:同步TCP.异步TCP编程,哪个用得多些? 解决方案 解决方案二:这真是一个糟糕的问题.如同做选择题,不是根据题意回答正确的答案,而是问,a.b.c.d在历次考试中哪一个选的多一些.解决方案三:该回复于2012-04-24 22:12:07被版主删除解决方案四:这需要根据项目在具体的应用环境进行选择.解决方案五:引用1楼的回复: 这真是一个糟糕的问题.如同做选择题,不

Java Socket编程实现简单的问候服务_java

本文实例讲解了Java Socket编程实现简单的问候服务的详细代码,供大家参考,具体内容如下 服务器端: 实现一个最简单的Hello服务,打印输出客户端IP地址到控制台,对任何连接的客户端都会发送一串字符(Hello, Java Socket)然后关闭与客户端连接.等待下一个客户端的连接请求到来. 客户端: 实现一个最简单的Socket连接到Hello服务器端,接受服务器端发送过来的字节数据打印并输出内容到控制台. 关键技巧: 由于JAVA中提供非常多的输入与输出流API,导致很多初学者接触J