简单的TCP服务器

创建一个简单的TCP服务器 以tcp_echo_server.c为例,说明创建tcp服务器的程序流程。 int main(int argc, char** argv) { if (argc < 2) { printf("Usage: tcp port\n"); return -10; } int port = atoi(argv[1]); hloop_t* loop = hloop_new(0); //创建一个loop //创建一个用来监听的io,用来 阅读详情

介绍

WinSock API是一套供Microsoft Windows操作系统使用的套接字程序库,它最初基于Berkeley套接字,但是其中加入了一些Microsoft的特殊改动。在这篇文章中,我要试着给你介绍如何使用WinSock来进行套接字程序设计,并假设你没有在任何操作系统上进行过网络编程的经验。
如果你只有一台单独的机器,那么不用着急,你仍然可以进行WinSock程序设计。你可以使用名为localhost的本地回环地址,它的IP地址是127.0.0.1。这样一来,如果你在机器上运行了一个TCP服务器,那么同一机器上的客户端程序就可以使用这个回环地址连接到服务器了。

简单的TCP服务器

在本文中,我将通过一个简单的TCP服务器来向你介绍WinSock,我们会一步一步地创建这个程序。但是,在我们开始之前,你还必须做一些事情,这样我们才能为开始我们的WinSock程序做好准备。
·
首先,使用VC++ 6.0应用程序向导来创建一个Win32 console application。
·
选择add support for MFC选项。
·
打开stdafx.h文件,并添加这一行:#include <winsock2.h>。
·
选择Project-Settings-Link,并在库模块列表中加入ws2_32.lib。

main函数

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    cout << "Press ESCAPE to terminate program/r/n";
    AfxBeginThread(ServerThread,0);
    while(_getch()!=27);

    return nRetCode;
}

我们在main()中所做的是开启一个线程,然后对一个_getch()调用进行循环。_getch()仅仅是等待一个键的按下,并返回这个读入字符的ASCII值。我们一直循环,直到返回27这个值为止——既然27是ESCAPE键的ASCII码。你可能想知道的是,即使我们按下了ESCAPE,我们开启的线程也还会是活动的状态。不用为这些事情担心,因为当main()返回的时候,进程就会被终止,主线程开启的线程也会被突然终止。

(我注:main是一个主线程,上面所讲的ServerThread是在主线程里开的一个守护线程,主线程开启一个守护线程后,任由守护线程去执行,main主线程还可以运行下去执行while(_getch()!=27)这句,当用户敲一个ESC键,就会接下去执行return nRetCode这句,进而main主线程结束,主线程结束后,守护线程就跟着结束了。另,在主线程里也可以开普通线程,普通线程不同于守护线程,main主线程在开普通线程处要停止运行下面的代码,而要等到普通线程执行完毕返回才接着执行main主线程后面的语句)

ServerThread函数

现在我所要做的事情就是把我们的ServerThread函数列出来,并使用代码的注释来解释相关的代码行做了些什么。我们的TCP服务器主要做的事情是监听端口20248,这个数字也就是我在Code Project的成员ID。这个过程中的事件是:当客户端连接的时候,服务器将会向客户端发回一条消息告知它的IP地址,然后关闭连接并继续接收20248端口的连接。它还会在运行的控制台上打印出连接来自的IP地址。总而言之,你可能会认为这是一个绝对没用的程序。事实上,你们中的有些人甚至可能会认为它和Windows中的SNDREC32.EXE一样没用。我说,你们也忒苛刻了吧。

UINT  ServerThread(LPVOID pParam)
{
    cout << "Starting up TCP server/r/n";

    // SOCKET其实是unsigned int的一个typedef。
    //
在Unix中,套接字句柄就像文件句柄一样,都是unsigned int。
    //
既然在Windows下这些不是真的,那么我们就定义了一种新的数据类型,名为SOCKET。
    SOCKET server;

    // WSADATA是一个struct,WSAStartup的调用将会填充之。
    WSADATA wsaData;

    // sockaddr_in为TCP/IP套接字指定了套接字的地址。
    //
其它的协议都使用相似的结构。
    sockaddr_in local;

    // WSAStartup为程序调用WinSock进行了初始化。
    //
第一个参数指定了程序允许使用的WinSock规范的最高版本。
    int wsaret=WSAStartup(0x101,&wsaData);

    // 如果成功,WSAStartup返回零。
    //
如果失败,我们就退出。
    if(wsaret!=0)
    {
        return 0;
    }

    // 现在我们来为sockaddr_in结构赋值。
    local.sin_family=AF_INET; //
地址族
    local.sin_addr.s_addr=INADDR_ANY; //
网际IP地址
    local.sin_port=htons((u_short)20248); //
使用的端口

    // 由socket函数创建我们的SOCKET。
    server=socket(AF_INET,SOCK_STREAM,0);

    // 如果socket()函数失败,我们就退出。
    if(server==INVALID_SOCKET)
    {
        return 0;
    }

    // bind将我们刚创建的套接字和sockaddr_in结构联系起来。
    //
它主要使用本地地址及一个特定的端口来连接套接字。
    //
如果它返回非零值,就表示出现错误。
    if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
    {
        return 0;
    }

    // listen命令套接字监听来自客户端的连接。
    //
第二个参数是最大连接数。
    if(listen(server,10)!=0)
    {
        return 0;
    }

    // 我们需要一些变量来保存客户端的套接字,因此我们在此声明之。
    SOCKET client;
    sockaddr_in from;
    int fromlen=sizeof(from);

    while(true) // 无限循环
    {
        char temp[512];

        // accept()将会接收即将到来的客户端连接。
        client=accept(server,
            (struct sockaddr*)&from,&fromlen);

        sprintf(temp,"Your IP is %s/r/n",inet_ntoa(from.sin_addr));

        // 我们简单地向客户端发送这个字符串。
        send(client,temp,strlen(temp),0);
        cout << "Connection from " << inet_ntoa(from.sin_addr) <<"/r/n";

        // 关闭客户端套接字
        closesocket(client);

    }

    // closesocket()关闭套接字,并释放套接字描述符。
    closesocket(server);

    // 最初这个函数也许有些用处,现在保留它只是为了向后兼容。
    //
但是调用它可能会更安全,因为我相信某些实现会使用它来结束WS2_32.DLL的使用。
    WSACleanup();

    return 0;
}

测试

运行这个服务器,并在它运行的时候使用telnet来连接机器的20248端口。如果你是在同一台机器上使用,那么就连接到localhost。

示例输出

我们将会在服务器上看到这样的输出:

E:/work/Server/Debug>server
Press ESCAPE to terminate program
Starting up TCP server
Connection from 203.200.100.122
Connection from 127.0.0.1
E:/work/Server/Debug>

这是客户端得到的:

nish@sumida:~$ telnet 202.89.211.88 20248
Trying 202.89.211.88...
Connected to 202.89.211.88.
Escape character is '^]'.
Your IP is 203.200.100.122
Connection closed by foreign host.
nish@sumida:~$

总结

呃,在本文中你了解了如何创建一个简单的TCP服务器。在以后的文章中,我会给你一些更多的材料,你可以通过这些材料创建一个合适的TCP客户端。如果有谁对于编译这些代码有问题的话可以mail我,我会发给你一个压缩了的工程。谢谢您的阅读。

socket编程之简单的TCP服务器 一、socket编程 socket编程socket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成 的socketpair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连接的一 阅读详情

相关推荐

Android搭建简单的socket服务器——基于TCP

移动端基本上用http很多, 很少接触socket编程,对于在android端作为服务器更少,最近因为项目需要,要在android端搭建服务器,中转智能硬件发来的数据,所以写了个socket的简易服务器,实现了客户端连接到服务器,发送文本信息,服务器回传给客户端,有木有感觉像大学课设

mashoujun2012的博客 1万+

TCP服务器

TCP服务器

m0_65682542的博客 2823

简单TCP服务器的建立

参数:socked创建套接字的返回值,sockfd必须是指向执行listen()调用以后的监听套接字。完成listen()后,socket()变成监听socket(listen socket);Af:地址族, 一般可用:PF_INET //internet协议。int listen(socket的返回值,同时可连接的数量);如果创建成功,返回创建好的套接字的文件描述符。

a123450q的博客 1211

TCP(TCP客户端、服务器如何通信)

TCP客户端、服务器如何通信,讲解了bind,listen,accept 等函数,与UDP的差别等等

BEIFEN13的博客 1万+

基于TCP实现简单的HTTP Web服务器

HTTP的操作过程、实现简单Web服务器

ZY-JIMMY 2860

从零到一:树莓派OpenWrt squashfs固件扩容背后的文件系统魔法

本文深入解析树莓派OpenWrt系统中squashfs固件的扩容原理与操作。通过理解squashfs与overlayfs的协同机制,掌握分区调整和文件系统扩容技巧,解决存储空间限制问题,提升设备可用性。

hadoop5ranger的博客 1037

【网络技术】TCP详解

TCP协议提供了可靠的数据传输、流量控制、拥塞控制、数据重传、数据分段和序列号等功能。 在TCP协议进行数据传输之前,需要先建立TCP连接,建立连接的过程中,客户端和服务器进行三次握手(SYN、SYN-ACK、ACK),以确保双方都能够接收和发送数据。 TCP协议通过使用ACK确认机制和序列号机制,保证传输的数据不会丢失、重复或者失序。每个数据包都会被确认,并且数据包的传输顺序不会发生错误。 此外,TCP协议还提供了流量控制、拥塞控制、数据重传、数据分段和序列号等功能,以满足不同的传输需求。

颜淡慕潇 4万+

2025-E题国一-简易自行瞄准装置:基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计

本文详细介绍了2025年全国大学生电子设计竞赛E题一等奖作品——基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计。该系统通过地猛星主控实现小车巡线,天猛星主控驱动云台,结合K230开发板的视觉识别能力,构建了一套完整的视觉巡线云台系统,实现了自动巡线与精准瞄准功能。文章深入剖析了硬件选型、双闭环PID控制算法、视觉识别与目标跟踪等核心技术,并分享了系统调试与避坑经验。

weixin_42596011的博客 673

TCP/IP网络编程:TCP服务器的基础搭建以及使用io复用优化构建

基于io复用创建tcp服务器。select/poll/epoll入门

m0_73939403的博客 1745

设置Solidworks导出文件的坐标系,stl坐标系平移

使用solidworks输出的模型坐标不再原点,怎么平行坐标系,这个方法很简单

weixin_45650767的博客 1万+

Ansys Zemax实战:5步搞定衍射光学元件(DOE)设计,附赠超透镜(metalens)避坑指南

本文详细介绍了使用Ansys Zemax进行衍射光学元件(DOE)和超透镜(metalens)设计的5步实战流程。从基础光学系统搭建到相位面设计验证,再到制造准备与实测对比,全面解析了OpticStudio中的关键技巧和常见避坑指南,帮助工程师高效完成复杂光学元件设计。

orange的博客 618

简易TCP服务器搭建

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口.........

m0_45901455的博客 1万+

【Windows Server 2019】邮件服务器配置与管理——安装及配置Winmail服务器(上)

博文介绍了如何安装邮件服务器 Winmail,如何配置Winmail,包括运行服务器,Winmail管理工具介绍和域名配置。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 2万+

一、简单的TCP服务器

一、简单的TCP服务器介绍WinSock API是一套供Microsoft Windows操作系统使用的套接字程序库,它最初基于Berkeley套接字,但是其中加入了一些Microsoft的特殊改动。在这篇文章中,我要试着给你介绍如何使用WinSock来进行套接字程序设计,并假设你没有在任何操作系统上进行过网络编程的经验。如果你只有一台单独的机器,那么不用着急,你仍然可以进行WinSock

小样(lisiyong)的专栏 1274

【OS】AUTOSAR OS系统调用产生Trap的过程详解

AUTOSAR OS系统调用产生Trap的过程详解

qq_36056498的博客 2438

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2802

基于TCP的简单服务器

基于Tcp的简单服务器 UDP协议无连接类似于发微信 TCP协议有链接类似于打电话 所以基于TCP的服务器先要到内核中获取一个TCP连接,UDP不需要获取连接 TCP的连接管理是由操作系统的内核来管理的,客户端和服务器建立连接的过程中,完全由内核来进行负责。负责程序的代码感知不到 TCP的来连接管理需要先描述在组织 描述:通信的五元组 组织:使用一个阻塞队列来组织若干个连接对象 代码中调用这个accept方法就是从阻塞队列当中获取一个链接对象(在应用程序中的化身就是Socket对象) 后续数据读写都

weixin_45809829的博客 385

YOLOv8改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 346

简单的TCP服务器代码

#define _WINSOCK_DEPRECATED_NO_WARNINGS #include <WinSock2.h> #include <windows.h> #include <iostream> #pragma comment(lib,"ws2_32") using namespace std; int main(int argc, char* ar...

做一个快乐学习者 1174

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

网络字节序——TCP接口及其实现简单TCP服务器

本文介绍了TCP接口。简单实现TCP服务器的几种版本:单进程版、多进程版、多线程版及其各自特点。守护进程及其setsid函数,以及TCP协议通信流程:三次握手四次挥手

欢迎来到梨+萍的博客,不准备看点啥学习嘛。。。 1408

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

简单的TCP网络程序:英译汉服务器

下面介绍程序中用到的socket API,这些函数都在sys/socket.h中。

qq_64446981的博客 1983

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

简单TCP回射服务器

这个简单例子是执行如下步骤的一个回射服务器 (1)客户从标准输入读入一行文本,并写给服务器 (2)服务器从网络输入读入这行文本,并回射给客户 (3)客户从网络输入读入这行回射文本,并显示在标准输出上 我们在客户与服务器之间画了两个箭头,不过它们实际上构成一个全双工的TCP连接。fgets和fputs这两个函数来自标准I/O库, 尽管我们将开发自己的回射服务器实现大多数TCP/IP实现却已经提供这样...

Patrick的博客 836

1.基于TCP的简单套接字服务器实现

在本文中,我们将深入了解套接字(socket)及其在网络通信中的应用,特别是如何在服务器端创建一个基于TCP的简单通信框架。套接字是程序员进行网络通信的一组接口,主要分为客户端和服务器端。在这篇文章中,我们将重点关注服务器端的实现。

记录计算机学习路程 901

Python——简单的TCP & UDP 服务器 和 相应的客户端编程

Python——简单的TCP & UDP 服务器 和 相应的客户端编程 前言 : 本文参考了一些da lao的博客和其他学习网站,这里加以我自己的理解,总结出此文。欢迎大佬们指点。。 ps: csdn 莫名其妙会吞我制表符和空格,所以若排版看着不爽,,,忍着吧。。。 BEFORE WE CODING --------------

McDonnell_Douglas的博客 785

简单的Tcp服务器

源代码文件目录(src)这里有main.cpp,是服务器端程序头文件目录(include)各种.h文件实例程序文件目录(test)这里写一个客户端连接程序项目构建文件(Makefile)完成项目的编译。

laugh哥的博客 848
上一篇: Socket(套接字)
下一篇: 简单的TCP客户端
发现心流
博客等级 码龄20年 52粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值