基于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编程实例的更多相关文章

  1. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  2. 【转】netlink socket编程实例

    [转]netlink socket编程实例 转自:http://blog.chinaunix.net/uid-14753126-id-2983915.html 关于Netlink IPC方式的介绍,请 ...

  3. NIO Socket编程实例

    1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO; import java.io.BufferedReader; ...

  4. TCP/UDP套接字 java socket编程实例

    网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. ...

  5. [转] - linux下socket编程实例

    一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...

  6. Java NIO Socket编程实例

    各I/O模型优缺点 BIO通信模型 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接 线程池I/O编程 假如所有可用 ...

  7. java socket编程实例代码

    1.所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 两性话题 两性 ...

  8. 网络编程之socket编程实例

    简单实例1 server.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include ...

  9. Linux下的C++ socket编程实例

    阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...

随机推荐

  1. 转载一篇关于kafka零拷贝(zero-copy)通俗易懂的好文

    原文地址 https://www.cnblogs.com/yizhou35/p/12026263.html 零拷贝就是一种避免CPU 将数据从一块存储拷贝到另外一块存储的技术. DMA技术是Direc ...

  2. CPU核数

    今天想看CPU核数,又忘记怎么看了QAQ. CPU的基本信息都被记录在/proc/cpuinfo中,一般直接cat /proc/cpuinfo就可以了. 主要是学习一下物理cpu核数/逻辑cpu核数的 ...

  3. Angular 的前世今生

    目录 序言 AngularJS 简介 Angular 2.0 的动机 现如今的 Angular Angular 的核心概念 参考 序言 Angular 一般意义上是指 Angular v2 及以上版本 ...

  4. canvas学习01

    canvas 必须指定宽高,确定可绘图区域的大小 canvas标签里写的是浏览器不支持canvas时展示的内容 <canvas id="drawing" width=&quo ...

  5. 发布一个自己做的图片转Base64的软件,Markdown写文章时能用到

    markdownpic 介绍 Markdown编辑时图片生成base64 软件架构 使用了.netcore winform框架 安装教程 直接运行即可 使用说明 拖拽图片文件 双击选择文件 复制粘贴图 ...

  6. jsp课堂笔记5 Java servlet

    servlet的创建 servlet类就是一个包含javax.servlet.http包中的HttpServlet类 部署web.xml文件 在<sevlet>标签中创建 <serv ...

  7. .Net Core in Docker极简入门(下篇)

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 Docker-Compose 代码修改 yml file up & down 镜像仓库 最后 前言 上一篇[. ...

  8. 图表可视化seaborn风格和调色盘

    seaborn是基于matplotlib的python数据可视化库,提供更高层次的API封装,包括一些高级图表可视化等工具. 使用seaborn需要先安装改模块pip3 install seaborn ...

  9. Redis之Redis的数据类型

    ​1.Redis的数据类型     Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及ZSet(有序集合)  2.String(字符串)    ...

  10. springboot2.2 集成 activity6 请假完整示例

    新手学习记录.写在springboot test 示例  示例代码地址看结尾.后面有带页面的示例. SpringBoot Test无页面简单示例 员工请假流程 员工发起申请,附带请假信息(请假几天) ...