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多线程 服务端: 服务器 ...
随机推荐
- Pycharm无法安装第三方库,错误代码Non-zero exit code (1) 的解决方案之pip升级
软件测试,B站爱码小哥邀你同行! 进入主题 问题场景:在pycharm进行安装某些库,install失败,提示需要升级pip ,报错界面问题如下错误代码Non-zero exit code 大致意思是 ...
- 可能这是Redis可视化工具最全的横向评测
1 命令行 不知道大家在日常操作redis时用什么可视化工具呢? 以前总觉得没有什么太好的可视化工具,于是问了一个业内朋友.对方回:你还用可视化工具?直接命令行呀,redis提供了这么多命令,操作起来 ...
- 多国正在遭遇新型勒索病毒Petya侵袭
北京时间2017年6月27日晚,据外媒消息,多国正在遭遇 Petya 勒索病毒袭击,政府.银行.电力系统.通讯系统.企业以及机场都受到不同程度影响.请予关注,并做相应防范.相关事件描述及防范措施如下: ...
- Puppeteer爬虫实战(三)
本篇文章针对大家熟知的技术站点作为目标进行技术实践. 确定需求 访问目标网站并按照筛选条件(关键词.日期.作者)进行检索并获取返回数据中的目标数据.进行技术拆分如下: 打开目标网站 找到输入框元素 ...
- Django安装与简单配置(1)
目录 1. 环境准备 2. 开始安装 2.1 安装Django 2.2 安装 Mysql数据库 3. 开始配置 3.1 Django简单配置 3.1.1 创建一个工程(project)为devops: ...
- jenkins集群(一) -- 在Linux上部署
一.安装好jdk.maven.git 1.安装jdk并配置好全局变量 2.安装maven:yum install maven 3.安装jdk:yum install git 二 .安装jenkins ...
- vue学习(五) 访问vue内部元素或者方法
//html <div id="app"> <input type="button" value="ok" v-bind: ...
- 本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效)
本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效) 随着业务量的增加,本地的ES集群服务器性能和磁盘空间有点不够使用,项目组考虑使用腾讯云服务器,以下是我测试的使用_reindex ...
- 前端学习(十二):CSS排版
进击のpython ***** 前端学习--CSS排版 本节主要介绍网页排版中主要格式化元素属性 帮助开发者把css技术与网页排版紧密联系到一起,来更好的实现网页设计效果 字体属性 字体 在日常工作中 ...
- VIM的常用快捷方式(尽量简洁,删去能组合实现的且不易记的)
vi可以分为三种状态,分别是一般模式.编辑模式和命令行模式 1一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或 ...