基于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. PHP实现多继承

    题问php是否支持多继承? 答案:不可以,只支持单继承. 如何实现多继承呢? 答案:可以使用 interface 或 trait 实现 . interface这里我们就不做过多的说明了,它的原理就是一 ...

  2. Redis 分布式锁(一)

    前言 本文力争以最简单的语言,以博主自己对分布式锁的理解,按照自己的语言来描述分布式锁的概念.作用.原理.实现.如有错误,还请各位大佬海涵,恳请指正.分布式锁分两篇来讲解,本篇讲解客户端,下一篇讲解r ...

  3. There are unfinished transactions remaining. Please run yum-complete-transaction as root.

    问题:CentOS  运行软件更新时,提示如下错误. 解决办法: 在终端界面,运行   sudo yum-complete-transaction.

  4. Burp Suite Proxy Module - 代理模块

    官方参考链接:https://portswigger.net/burp/documentation/desktop/tools/proxy/using 1.Burp Suite 代理设置选项 2.浏览 ...

  5. Python Ethical Hacking - TROJANS Analysis(5)

    Spoofing File Extention - A trick. Use the Kali Linux Program - Characters 1. Open the program. 2. F ...

  6. QQ音乐Android客户端Web页面通用性能优化实践

    QQ音乐 Android 客户端的 Web 页面日均 PV 达到千万量级,然而页面的打开耗时与 Native 页面相距甚远,需要系统性优化.本文将介绍 QQ 音乐 Android 客户端在进行 Web ...

  7. 牛客练习赛 66B题解

    前言 当初思路 开始没想到异或这么多的性质,于是认为对于每个点\(u\),可以和它连边的点\(v\)的点权 \(a_v=a_u \oplus k\)(证明:\(\because\) \(a_u\opl ...

  8. 技术小菜比入坑 LinkedList,i 了 i 了

    先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个长发飘飘却靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理 ...

  9. C++语法小记---少见的语法之一

    很少用,列出来,便于理解和熟悉!!! // 1.单独使用位域限定符 ::xxx() //调用全局函数xxx // 2.全局重载new和delete T* tmp = (T*)(::operator n ...

  10. DJANGO-天天生鲜项目从0到1-004-用户模块-个人中心页

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...