socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信

由于UNIX和Win的socket大同小异,为了方便和大众化,这里先介绍Winsock编程。
socket 网络编程的难点在入门的时候就是对基本函数的了解和使用,由于这些函数的结构往往比較复杂,參数大部分都是结构体,令人难以记忆和理解。
可是一旦我们知道这些函数包含其參数的详细含义,socket网络编程也就变得不是那么复杂。

这里不赘述 详细函数的详细含义。网络上有非常多的文章。同一时候笔者建议大家參考
MSDN。对返回值,參数等会有更好的理解。

下面均为单线程的简单实例,多线程的请关注下一篇文章。
(一)
UDP:中文名是用户数据报协议。是OSI參考模型中的一种无连接的传输层协议。提供面向事物的简单不可靠信息传送服务,在网络良好的情况下也可能会出现丢包现象。
UDP通讯流程:
(Winsock的初始化:WSAStartup) //windows特有的
Server端:
socket:建立套接字
bind:公布port(netstat -an可见已经公布的port)
sendto/recv/recvfrom:收发数据

Client端:
socket:建立套接字
bind:公布port(netstat -an可见已经公布的port)
sendto/recv/recvfrom:收发数据
其它函数详见凝视。

UDP--Client
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")  //编译器设置--链接库
using namespace std;
const int PORT = 8009;int main()
{int n;WSADATA wd;n = WSAStartup(MAKEWORD(2, 2), &wd);if (n){cout << "WSAStartup函数错误!" << endl;return -1;}SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);   //SOCK_DGRAM代表UDPif (INVALID_SOCKET == sock){cout << "socket建立失败。" << endl;return -1;}sockaddr_in sa = { AF_INET };   //随机分配一个port (仅初始化一个值,让client自己分配port)n = bind(sock, (sockaddr*)&sa, sizeof(sa)); if (n == SOCKET_ERROR){cout << "bind函数失败。" << endl;cout << "错误码是:" << WSAGetLastError() << endl;return -1;}sockaddr_in sa1 = { AF_INET, htons(8009) };   //必须使用htons。由于网络字节序的缘故sa1.sin_addr.S_un.S_addr = inet_addr("192.168.253.1");//指定要发往的IP和port号char s[256];while (true){fflush(stdin);gets(s);sendto(sock, s, strlen(s), 0,(sockaddr*)&sa1,sizeof(sa1)); //发送数据}return 0;
}
UDP-Server
#include <cstdio>
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
const int PORT = 8009;
int main()
{int n;WSADATA wd;n=WSAStartup(MAKEWORD(2, 2), &wd);if (n){cout << "WSAStartup函数错误!

" << endl; return -1; } SOCKET sock = socket(AF_INET, SOCK_DGRAM,0); if (INVALID_SOCKET == sock) { cout << "socket建立失败!" << endl; cout << "错误码是:" << WSAGetLastError() << endl; return -1; } sockaddr_in sa = { AF_INET, htons(PORT) }; n=bind(sock,(sockaddr*)&sa, sizeof(sa)); if (n == SOCKET_ERROR) { cout << "bind绑定port失败。" << endl; cout << "错误码是:" << WSAGetLastError() << endl; return -1; } else { cout << "port公布成功:" << PORT << endl; } char s[256]; while (true) { n = recv(sock, s, sizeof(s), 0); //recv返回的是实际copy的字节数 s[n] = '\0'; cout << s << endl; } return 0; }

(二)
TCP: 是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。
TCP通讯流程
(Winsock的初始化:WSAStartup)
Server端:
socket:建立套接字
bind:公布port
listen:開始侦听
accept:接纳client连接(如同公司的前台)
send/recv/recvfrom:收发数据(如同公司的客户经理)

Client端:
socket:建立套接字
bind:公布port(client能够不绑定或绑定0port)
connect:连接到server
send/recv/recvfrom:收发数据(如同公司的客户经理)
一般通讯流程是按:CS两方1发1收对称的。一旦收发顺讯混乱软件就失控了。
(请求应答模式:Request/Reply)

TCP---Server
#include <cstdio>
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
const int PORT = 8009;
int main()
{int n;WSADATA wd;n=WSAStartup(MAKEWORD(2, 2), &wd);if (n){cout << "WSAStartup函数错误!" << endl;return -1;}SOCKET sock = socket(AF_INET, SOCK_STREAM,0);if (INVALID_SOCKET == sock){cout << "socket建立失败!" << endl;cout << "错误码是:" << WSAGetLastError() << endl;return -1;}sockaddr_in sa = { AF_INET, htons(PORT) };n=bind(sock,(sockaddr*)&sa, sizeof(sa));if (n == SOCKET_ERROR){cout << "bind绑定port失败。" << endl;cout << "错误码是:" << WSAGetLastError() << endl;return -1;}else{cout << "port公布成功:" << PORT << endl;}listen(sock, 5); //第二个參数一般设置5int nlen = sizeof(sa);SOCKET socka = accept(sock, (sockaddr*)&sa, &nlen); //会返回一个新的连接套接字if (socka == INVALID_SOCKET){cout << "accepth函数失败!

" << endl; cout << "错误码是:" << WSAGetLastError() << endl; return -1; } cout << "有人连接进来:" << inet_ntoa(sa.sin_addr) << "--" << htons(sa.sin_port) << endl;//输出连接者的ip和port char s[256]; while ((n = recv(socka, s, sizeof(s)-1, 0)) > 0) //-1是留给‘\0’一个位置 { s[n] = '\0'; cout << s << endl; /* char k[256] = "你好啊"; if (strcmp(s,k)==0) cout << "你好你好。大家都好哈。" << endl;*/ } return 0; }

TCP---Client
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
const int PORT = 8009;int main()
{int n;WSADATA wd;n = WSAStartup(MAKEWORD(2, 2), &wd);if (n){cout << "WSAStartup函数错误!" << endl;return -1;}SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == sock){cout << "socket建立失败!" << endl;return -1;}sockaddr_in sa = { AF_INET };   //随机分配一个port n = bind(sock, (sockaddr*)&sa, sizeof(sa));if (n == SOCKET_ERROR){cout << "bind函数失败!

" << endl; cout << "错误码是:" << WSAGetLastError() << endl; return -1; } sa.sin_addr.S_un.S_addr = inet_addr("192.168.253.1");//115.200.33.112 sa.sin_port = htons(PORT); n = connect(sock, (sockaddr*)&sa, sizeof(sa)); //指定port发送数据 if (n == SOCKET_ERROR) { cout << "connect函数失败!" << endl; cout << "错误码是:" << WSAGetLastError() << endl; return -1; } char s[256]; while (true) { fflush(stdin); gets(s); send(sock, s, strlen(s), 0); } return 0; }

posted on 2017-07-21 18:39 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/7219179.html

socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信相关推荐

  1. 【Socket网络编程进阶与实战】------ Socket网络编程快速入门

    前言 本篇博客主要是分享,socket网络编程进阶与实践☞socket网络编程快速入门 一.聊一聊Socket 学习目标与收获

  2. socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

  3. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程     1.OSI七层协议     2.基于tcp协议的套接字通信     3.模拟ssh远程执行命令     4.tcp的粘包问题及解决方案     5.基于udp协 ...

  4. BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程

    BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...

  5. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  6. C# Socket网络编程入门(服务器与客户端通信,客户端与客户端通信)

    WebSocket全双工通讯链接,用于前台和后台自由发送信息 一.效果展示: 效果描述: 1.服务器充当管理员,给所有人发送信息,除服务器以外其他人都能接受到. 2.其他用户发送信息除自己以外其他用户 ...

  7. C++网络编程快速入门(四):EPOLL模型使用

    目录 基本使用方法 step1:创建epollfd step2:将fd绑定到epollfd step3:调用epoll_wait检测事件 epoll_wait与poll.select区别所在 水平触发 ...

  8. C++网络编程快速入门(二):Linux下使用select演示简单服务端程序

    目录 select参数解释 select使用规范 select使用缺点 基本流程 实例代码 通信效果演示 往期文章 select参数解释 extern int select (int __nfds, ...

  9. 18.Socket网络编程

    JavaSE高级 网络编程 第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构 :全称为Brow ...

  10. 网络编程-java入门

    网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复 ...

最新文章

  1. linux内核中send与recv函数详解
  2. 【若依(ruoyi)】自定义layer
  3. iOS之深入分析GCD的函数与队列以及多种组合使用
  4. 本机连接opc server有部分数据不刷新_实时数据库PI在企业MES系统中的应用
  5. 连接postgresql
  6. 第2月第5天 arc invocation getReturnValue
  7. Spring Hibernate集成示例教程
  8. php tp5.3,[李景山php]每天TP5-20161226|thinkphp5-Console.php-3
  9. Linux命令解释之tail
  10. RapidXML的读写
  11. linux能解锁小米手机吗,【BL锁】还在为小米手机如何解锁及解锁后如何加锁而烦恼吗?...
  12. blastn、blastp、blastx、tblastn和tblastx的区别与用法
  13. 矩阵转置与矩阵对称性的关系
  14. 用python爬取网易云音乐评论
  15. 微分方程模型_MIT—微分方程笔记03 一阶线性常微分方程解法
  16. 华为内容安全反病毒总结
  17. 2022-2028年中国建筑劳务行业发展模式分析及投资趋势预测报告
  18. 致远SPM解决方案之资产管理
  19. 408王道计算机网络强化——传输层和应用层
  20. 大咖说*计算讲谈社|商用车智能驾驶商业化实践

热门文章

  1. 本博已停用,现在的博客是www.mutousay.com
  2. GridView中BoundField重复绑定数据
  3. SQL Server DTS
  4. python 指定版本号
  5. 文本生成系列之transformer结构扩展(一)
  6. 【模型压缩】知识蒸馏经典解读
  7. 【爱你 祖国】细看我国智能无人机如何从无到有?都是被逼出来的!
  8. leetcode—16.两数相加链表python解答
  9. 为什么我们需要Pulsar?
  10. 博文视点MySQL书单丨无惧停机故障,数据库异常不可怕