当前位置: 首页 > news >正文

【Socket】Windows下C语言的Socket编程例子(TCP和UDP)

TCP服务端通信的常规步骤:

  • 使用 socket() 创建 TCP 套接字(socket)
  • 将创建的套接字绑定到一个本地地址和端口上(Bind)
  • 将套接字设为监听模式,准备接收客户端请求(listen)
  • 等待客户请求到来: 当请求到来后,接受连接请求,返回一个对应于此次连接的新的套接字(accept)
  • 用 accept 返回的套接字和客户端进行通信(使用 write() / send() 或 send() / recv() )返回,等待另一个客户请求关闭套接字

在这里插入图片描述

TCP客户端通信的常规步骤:

  • 创建套接字(socket)
  • 使用 connect() 建立到达服务器的连接(connect)
  • 客户端进行通信(使用 write() / send() 或 send() / recv() )
  • 使用 close() 关闭客户连接

一。  TCP

server端:

 C++ Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

 

#include "stdafx.h"#include #include #pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[])
{//初始化WSA    WORD sockVersion = MAKEWORD(2,2);
    WSADATA wsaData;if(WSAStartup(sockVersion, &wsaData)!=0)
    {return 0;
    }//创建套接字    SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(slisten == INVALID_SOCKET)
    {
        printf("socket error !");return 0;
    }//绑定IP和端口    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);
    sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        printf("bind error !");
    }//开始监听    if(listen(slisten, 5) == SOCKET_ERROR)
    {
        printf("listen error !");return 0;
    }//循环接收数据    SOCKET sClient;
    sockaddr_in remoteAddr;int nAddrlen = sizeof(remoteAddr);char revData[255]; while (true)
    {
        printf("等待连接...\n");
        sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INVALID_SOCKET)
        {
            printf("accept error !");continue;
        }
        printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));//接收数据        int ret = recv(sClient, revData, 255, 0);        if(ret > 0)
        {
            revData[ret] = 0x00;
            printf(revData);
        }//发送数据        char * sendData = "你好,TCP客户端!\n";
        send(sClient, sendData, strlen(sendData), 0);
        closesocket(sClient);
    }
    closesocket(slisten);
    WSACleanup();return 0;
}

client端:

 C++ Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

 

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <windows.h>#pragma  comment(lib,"ws2_32.lib")int main(int argc, char *argv[])
{
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA data;if(WSAStartup(sockVersion, &data) != 0)
    {return 0;
    }
    SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sclient == INVALID_SOCKET)
    {
        printf("invalid socket !");return 0;
    }
    sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    {
        printf("connect error !");
        closesocket(sclient);return 0;
    }char *sendData = "你好,TCP服务端,我是客户端!\n";
    send(sclient, sendData, strlen(sendData), 0);char recData[255];int ret = recv(sclient, recData, 255, 0);if(ret > 0)
    {
        recData[ret] = 0x00;
        printf(recData);
    }
    closesocket(sclient);
    WSACleanup();return 0;
}

二.UDP

SERVER 端

 C++ Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

 

#include "stdafx.h"#include #include #pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[])
{
    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2,2);if(WSAStartup(sockVersion, &wsaData) != 0)
    {return 0;
    }
    SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(serSocket == INVALID_SOCKET)
    {
        printf("socket error !");return 0;
    }
    sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    serAddr.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    {
        printf("bind error !");
        closesocket(serSocket);return 0;
    }
    sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr); while (true)
    {char recvData[255];  int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);if (ret > 0)
        {
            recvData[ret] = 0x00;
            printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
            printf(recvData);            
        }char * sendData = "一个来自服务端的UDP数据包\n";
        sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);    
    }
    closesocket(serSocket); 
    WSACleanup();return 0;
}

 C++ Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

 

#include "stdafx.h"#include #include #pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[])
{
    WORD socketVersion = MAKEWORD(2,2);
    WSADATA wsaData; if(WSAStartup(socketVersion, &wsaData) != 0)
    {return 0;
    }
    SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);
    sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int len = sizeof(sin);char * sendData = "来自客户端的数据包.\n";
    sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);char recvData[255];     int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);if(ret > 0)
    {
        recvData[ret] = 0x00;
        printf(recvData);
    }
    closesocket(sclient);
    WSACleanup();return 0;
}

本文来至:http://blog.csdn.net/ssun125/article/details/8525823

socket  ['sɒkɪt]  详细X

基本翻译

n. 插座;窝,穴;牙槽

vt. 给…配插座

网络释义

socket: 插座

Socket F: Socket F

Socket 2: Socket 2

socket  ['sɒkɪt]  socket&type=1详细X

基本翻译

n. 插座;窝,穴;牙槽

vt. 给…配插座

网络释义

socket: 插座

Socket F: Socket F

Socket 2: Socket 2

相关文章:

  • 【php扩展】PHP-CPP:一个开发PHP扩展的C++库
  • 【php构架】Zend Enginephp
  • 【AOP】轻松理解AOP(面向切面编程)
  • 【GCC】生成debug、release、32位版与64位版|gcc参数和DEBUG条件编译
  • 【stl map】C++中的STL中map用法详解
  • 【socket】Socket send函数和recv函数详解
  • 【OLTP与OLAP】OLTP与OLAP的区别
  • 【gcc】 gcc编译工具生成动态库(共享库)和静态库
  • 【cJSON】cJSON 实例
  • 【yum/apt-get】yum/apt-get/rpm/dpkg/brew之间的区别
  • 【删除重复记录】SQL删除重复记录
  • 【myISAM和innoDB】mySql的引擎myisam和innodb的区别/mysiam
  • 【文档/键值数据库】文档数据库和键值数据库有什么区别
  • 【JDBC与JPA】JDBC与JPA
  • Apache+Tomcat配置转发
  • [数据结构]链表的实现在PHP中
  • 【刷算法】从上往下打印二叉树
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular4 模板式表单用法以及验证
  • cookie和session
  • es6--symbol
  • es的写入过程
  • Fabric架构演变之路
  • github指令
  • HTML中设置input等文本框为不可操作
  • JavaScript的使用你知道几种?(上)
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mac修复ab及siege安装
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • spark本地环境的搭建到运行第一个spark程序
  • 程序员该如何有效的找工作?
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于遗传算法的优化问题求解
  • 解析 Webpack中import、require、按需加载的执行过程
  • 为什么要用IPython/Jupyter?
  • 我从编程教室毕业
  • 移动端 h5开发相关内容总结(三)
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 正则表达式-基础知识Review
  • ​flutter 代码混淆
  • ​Linux·i2c驱动架构​
  • ​低代码平台的核心价值与优势
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #NOIP 2014#Day.2 T3 解方程
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (11)MATLAB PCA+SVM 人脸识别
  • (8)STL算法之替换
  • (pytorch进阶之路)扩散概率模型
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (十一)手动添加用户和文件的特殊权限
  • (算法)Game