C++/C socket编程实例
基于TCP的socket编程
服务器代码
服务器端代码如下
//TCPServer.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") 
#define PORT 8888	//端口号
#define BACKLOG 5	//最大监听数
char serverAddr[16] = "192.168.0.3";//服务器端IP
int main()
{
	WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		/*
		使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
		操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
		然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
		 */
		printf_s("WSAStartup失败.\n"); // 初始化失败
		exit(1);
	}
	SOCKET socketFD = 0;  //socket句柄
	int recvLen = 0;   //接收成功后的返回值
	SOCKET newFD = 0; 	//建立连接后的句柄
	char buf[4096] = { 0 }; //buff缓冲区
	SOCKADDR_IN addrServer, addrClient;
	socketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
	if (INVALID_SOCKET == socketFD)
	{
		printf_s("创建socket失败\n");
		printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
		return 0;
	}
	printf_s("创建socket成功\n");
	addrServer.sin_family = AF_INET;  /*该属性表示接收本机或其他机器传输*/
	addrServer.sin_port = htons(PORT); /*端口号*/
	addrServer.sin_addr.S_un.S_addr = inet_addr(serverAddr);/*服务器IP*/
	//连接方法: 传入句柄,目标地址,和大小
	if (0 > connect(socketFD, (SOCKADDR*)&addrServer, sizeof(addrServer)))
	{
		printf_s("连接服务器失败\n");
		printf_s("CONNECT ERROR #%d\n", WSAGetLastError());
	}
	else {
		printf("连接服务器成功\n");
		recv(socketFD, buf, sizeof(buf), 0); ////将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。 
		printf("Recv:%s\n", buf);
	}
	return 0;
}
客户端代码
客户端代码如下
//TCPClient.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") 
#define PORT 8888	//端口号
#define BACKLOG 5	//最大监听数
char serverAddr[16] = "192.168.0.3";//服务器端IP
int main()
{
	WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		/*
		使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
		操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
		然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
		 */
		printf_s("WSAStartup失败.\n"); // 初始化失败
		exit(1);
	}
	SOCKET socketFD = 0;  //socket句柄
	int recvLen = 0;   //接收成功后的返回值
	SOCKET newFD = 0; 	//建立连接后的句柄
	char buf[4096] = { 0 }; //buff缓冲区
	SOCKADDR_IN addrServer, addrClient;
	socketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
	if (INVALID_SOCKET == socketFD)
	{
		printf_s("创建socket失败\n");
		printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
		return 0;
	}
	printf_s("创建socket成功\n");
	addrServer.sin_family = AF_INET;  /*该属性表示接收本机或其他机器传输*/
	addrServer.sin_port = htons(PORT); /*端口号*/
	addrServer.sin_addr.S_un.S_addr = inet_addr(serverAddr);/*服务器IP*/
	//连接方法: 传入句柄,目标地址,和大小
	if (0 > connect(socketFD, (SOCKADDR*)&addrServer, sizeof(addrServer)))
	{
		printf_s("连接服务器失败\n");
		printf_s("CONNECT ERROR #%d\n", WSAGetLastError());
	}
	else {
		printf("连接服务器成功\n");
		recv(socketFD, buf, sizeof(buf), 0); ////将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。 
		printf("Recv:%s\n", buf);
	}
	return 0;
}
运行结果
服务器端
客户端
基于UDP的socket编程
服务器代码
//UDPServer.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") 
#define PORT 8888	//端口号
#define BACKLOG 5	//最大监听数
int main()
{
	WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		/*
		使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
		操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
		然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
		 */
		printf_s("WSAStartup失败.\n"); // 初始化失败
		exit(1);
	}
	SOCKET socketFD = 0;  //socket句柄
	int bufLen = 0;   //接收成功后的返回值
	char buf[4096] = { 0 }; //buff缓冲区
	int fromLen = sizeof(SOCKADDR);
	SOCKADDR_IN addrServer, addrClient;
	socketFD = socket(AF_INET, SOCK_DGRAM, 0); //建立socket
	if (INVALID_SOCKET == socketFD)
	{
		printf_s("创建socket失败\n");
		printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
		return 0;
	}
	printf_s("创建socket成功\n");
	addrServer.sin_family = AF_INET;  /*该属性表示接收本机或其他机器传输*/
	addrServer.sin_port = htons(PORT); /*端口号*/
	addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); /*IP,括号内容表示本机IP*/
	//绑定地址结构体和socket
	if (bind(socketFD, (SOCKADDR*)&addrServer, sizeof(addrServer)))
	{
		printf_s("绑定失败\n");
		printf_s("BIND ERROR #%d\n", WSAGetLastError());
		return 0;
	}
	printf_s("绑定端口%d成功\n", PORT);
	while (true) {
		bufLen = recvfrom(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrClient, &fromLen);
		if (bufLen < 0) {
			printf_s("RECV ERROR#%d\n", WSAGetLastError());
			continue;
		}
		printf_s("收到来自客户端[%s:%d]的数据报:%s",inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port),buf);
		char send[] = { "服务器接收到客户数据报,这是返回信息" };
		memcpy_s(buf, sizeof(buf), send, sizeof(send));
		bufLen = sendto(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrClient, sizeof(addrClient));
		if (bufLen < 0) {
			printf_s("SEND ERROR#%d\n", WSAGetLastError());
			continue;
		}
	}
	closesocket(socketFD);
	WSACleanup();
	return 0;
}
客户端代码
//UDPClient.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") 
#define PORT 8888	//端口号
#define BACKLOG 5	//最大监听数
char serverAddr[16] = "192.168.0.3";
int main()
{
	WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		/*
		使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
		操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
		然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
		 */
		printf_s("WSAStartup失败.\n"); // 初始化失败
		exit(1);
	}
	SOCKET socketFD = 0;  //socket句柄
	int bufLen = 0;   //接收成功后的返回值
	char buf[4096] = { 0 }; //buff缓冲区
	int fromLen = sizeof(SOCKADDR);
	SOCKADDR_IN addrServer, addrClient;
	socketFD = socket(AF_INET, SOCK_DGRAM, 0); //建立socket
	if (INVALID_SOCKET == socketFD)
	{
		printf_s("创建socket失败\n");
		printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
		return 0;
	}
	printf_s("创建socket成功\n");
	addrServer.sin_family = AF_INET;  /*该属性表示接收本机或其他机器传输*/
	addrServer.sin_port = htons(PORT); /*端口号*/
	addrServer.sin_addr.S_un.S_addr = inet_addr(serverAddr); /*IP,括号内容表示本机IP*/
	char send[] = "这里是客户端,发送信息给服务器";
	memcpy_s(buf, sizeof(buf), send, sizeof(send));
	bufLen = sendto(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrServer, sizeof(addrServer));
	if (bufLen < 0) {
		printf_s("SEND ERROR#%d\n", WSAGetLastError());
		return 0;
	}
	bufLen= recvfrom(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrClient, &fromLen);
	if (bufLen < 0) {
		printf_s("RECV ERROR#%d\n", WSAGetLastError());
		return 0;
	}
	printf_s("收到来自服务器[%s:%d]的数据报:%s", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port), buf);
	closesocket(socketFD);
	WSACleanup();
	return 0;
}
运行结果
服务器端
客户端
C++/C socket编程实例的更多相关文章
- linux下socket编程实例
		linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ... 
- 【转】netlink socket编程实例
		[转]netlink socket编程实例 转自:http://blog.chinaunix.net/uid-14753126-id-2983915.html 关于Netlink IPC方式的介绍,请 ... 
- NIO Socket编程实例
		1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO; import java.io.BufferedReader; ... 
- TCP/UDP套接字 java socket编程实例
		网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. ... 
- [转] - linux下socket编程实例
		一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ... 
- Java NIO Socket编程实例
		各I/O模型优缺点 BIO通信模型 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接 线程池I/O编程 假如所有可用 ... 
- java socket编程实例代码
		1.所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 两性话题 两性 ... 
- 网络编程之socket编程实例
		简单实例1 server.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include ... 
- Linux下的C++ socket编程实例
		阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ... 
随机推荐
- 转载一篇关于kafka零拷贝(zero-copy)通俗易懂的好文
			原文地址 https://www.cnblogs.com/yizhou35/p/12026263.html 零拷贝就是一种避免CPU 将数据从一块存储拷贝到另外一块存储的技术. DMA技术是Direc ... 
- CPU核数
			今天想看CPU核数,又忘记怎么看了QAQ. CPU的基本信息都被记录在/proc/cpuinfo中,一般直接cat /proc/cpuinfo就可以了. 主要是学习一下物理cpu核数/逻辑cpu核数的 ... 
- Angular 的前世今生
			目录 序言 AngularJS 简介 Angular 2.0 的动机 现如今的 Angular Angular 的核心概念 参考 序言 Angular 一般意义上是指 Angular v2 及以上版本 ... 
- canvas学习01
			canvas 必须指定宽高,确定可绘图区域的大小 canvas标签里写的是浏览器不支持canvas时展示的内容 <canvas id="drawing" width=&quo ... 
- 发布一个自己做的图片转Base64的软件,Markdown写文章时能用到
			markdownpic 介绍 Markdown编辑时图片生成base64 软件架构 使用了.netcore winform框架 安装教程 直接运行即可 使用说明 拖拽图片文件 双击选择文件 复制粘贴图 ... 
- jsp课堂笔记5 Java servlet
			servlet的创建 servlet类就是一个包含javax.servlet.http包中的HttpServlet类 部署web.xml文件 在<sevlet>标签中创建 <serv ... 
- .Net Core in Docker极简入门(下篇)
			Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 Docker-Compose 代码修改 yml file up & down 镜像仓库 最后 前言 上一篇[. ... 
- 图表可视化seaborn风格和调色盘
			seaborn是基于matplotlib的python数据可视化库,提供更高层次的API封装,包括一些高级图表可视化等工具. 使用seaborn需要先安装改模块pip3 install seaborn ... 
- Redis之Redis的数据类型
			1.Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及ZSet(有序集合) 2.String(字符串) ... 
- springboot2.2 集成 activity6 请假完整示例
			新手学习记录.写在springboot test 示例 示例代码地址看结尾.后面有带页面的示例. SpringBoot Test无页面简单示例 员工请假流程 员工发起申请,附带请假信息(请假几天) ... 
