基于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. Hello!GitHub 好用好玩值得收藏的开源项目集合~

    这是我许久以来从各处发现的极佳开源项目,希望分享给大家~ 如果帮到你了,给我个赞好嘛 编程语言类 ️learn-go-with-tests(通过单元测试学Go) GitHub地址:https://gi ...

  2. Docker部署LNMP完整教程

    在Docker中部署LNMP环境可以分为以下几个步骤: 安装Docker 创建镜像 创建Dockerfile build Docerfile 复制/修改配置文件 运行镜像,并映射端口 为了方便分布式部 ...

  3. vue配置 less 全局变量

    在使用Vue开发的过程中,通常会用到一些样式的全局变量,如果在每个组件中引入就太繁琐了,维护性也不好,因此全局引入是个不错的想法.下面以less为例,记录一下全局引入less变量的步骤: 1.首先安装 ...

  4. Spring RestTemplate 的介绍和使用-入门

    RestTemplate是什么? 传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient.不过此种方法使用起来太过繁琐.spring提供了一种简单便捷的模板类来进 ...

  5. [jvm] -- 类加载器及双亲委派模板篇

    类加载器 JVM 中内置了三个重要的 ClassLoader BootstrapClassLoader(启动类加载器):最顶层的加载类,由C++实现,负责加载 %JAVA_HOME%/lib目录下的j ...

  6. Everything搜索表达式

    导出搜索列表为txt或csv ​ 索引最近变化 维持一个额外的按照最近变化排序的系统文件数据库,其可以通过 rc: 搜索,或以最近变化排序. ​ 搜索运行次数大于 100: runcount:> ...

  7. SpringBoot多数据库连接(mysql+oracle)

    出于业务需求,有时我们需要在spring boot web应用程序中配置多个数据源并连接到多个数据库. 使用过Spring Boot框架的小伙伴们,想必都发现了Spring Boot对JPA提供了非常 ...

  8. Spring葵花宝典

    一 Spring简介 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 为了解决企业应用开发的复杂性而创建 二 Spring功能 1. 方便解耦 简化开发 Spring就是一 ...

  9. Socket通信,基本方法介绍

    Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口. 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口 ...

  10. Ubuntu Linux markdown编辑工具 typora 安装

    Typora简介 Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.即时渲染使得你写Markdown就想是写Word文档一样流畅自如 ...