基于win32的socket编程及程序实现
初步研究了win32平台的Windows Sockets,它是Microsoft Windows的网络程序设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给我们使用。包括流式套接字(提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。)和数据报套接字(提供无连接服务。数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。)、原始套接字。
CS模型:在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。
基于TCP(面向连接)的socket编程:
Sever服务器端程序: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、将套接字设为监听模式,准备接收客户请求(listen)。 4、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。 5、用返回的套接字和客户端进行通信(send/recv)。 6、返回,等待另一客户请求。 7、关闭套接字。
Client客户端程序: 1、创建套接字(socket)。 2、向服务器发出连接请求(connect)。 3、和服务器端进行通信(send/recv)。 4、关闭套接字。
TCP/IP模型编程流程如下图:

Socket的服务器段详细注释代码:
// server6.cpp : Defines the entry point for the console application.
//
//TcpServer.cpp
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#include <iostream>
using namespace std;
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( , );//SDK这个宏创建一个无符号16位整形,通过连接两个给定的无符号参数。表示1.1版本
err = WSAStartup( wVersionRequested, &wsaData );//通过WSAStartup函数完成对Winsock服务的初始化,调用socket必须初始化
if ( err != ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != ||HIBYTE( wsaData.wVersion ) != )//如果版本错误返回
{
WSACleanup( );//释放WSAStartup
return;
}
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,); //建立本地流式套接字,返回套接字号;af_inet地址族,用流式套接字,自动匹配
SOCKADDR_IN addrSrv;//TCP/IP的地址信息
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//允许套接字向任何分配给本地机器的IP地址发送或接收数据。
addrSrv.sin_family = AF_INET;//TCP指定的
addrSrv.sin_port = htons();//端口号
bind(sockSrv,(sockaddr*)&addrSrv,sizeof(SOCKADDR));//绑定套接字
listen(sockSrv,);//#####监听本地套接字
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char revBuf[],sendBuf[]; while()
{
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);//接受链接等待客户端链接,返回客户套接字
char sendBuf[];
cout<<"我说:\n";
//sprintf(sendBuf,"Welcome %s to chat with me!",inet_ntoa(addrClient.sin_addr));
cin>>sendBuf;
send(sockConn,sendBuf,strlen(sendBuf)+,); recv(sockConn,revBuf,,);
cout<<"对方说:\n";
printf("%s\n",revBuf);
memset(revBuf,,);
closesocket(sockConn);
}
closesocket(sockSrv);
}
Socket的客户端详细注释代码:
//TcpClient.cpp
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <iostream>
using namespace std;
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( , );
err = WSAStartup( wVersionRequested, &wsaData );//初始化
if ( err != )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != ||HIBYTE( wsaData.wVersion ) != )
{
WSACleanup( );
return;
}
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,);//建立套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//"49.152.49.84");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons();
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//连接到目的主机
char recvBuf[],sendBuf[];
while (true)
{ recv(sockClient,recvBuf,,);
cout<<"对方说:";
printf("%s\n",recvBuf);
memset(recvBuf,,);
cout<<"我说:";
cin>>sendBuf;
send(sockClient,sendBuf,strlen(sendBuf)+,);
} closesocket(sockClient);//关闭套接字
WSACleanup();
}
整理以上,供参考。
基于win32的socket编程及程序实现的更多相关文章
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...
- win32下Socket编程(转载)
在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:htt ...
- 基于MFC的socket编程
网络编程 1.windows 套接字编程(开放的网络编程接口)添加头文件#include<windows.h> 2.套接字及其分类 socket分为两种:(1)数据报socket:无连接套 ...
- 【转/TCP协议编程】 基于TCP的Socket 编程
基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...
- 基于C#的socket编程的TCP同步实现
该博客源著地址https://www.cnblogs.com/sunev/archive/2012/08/05/2604189.html 一.摘要 总结一下基于C#的TCP传输协议的涉及到的常用方法及 ...
- 基于java的socket编程
#开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好, ...
- Java基于TCP的Socket编程练习
环境:Notpad ++ 6.0 + JDK 6.0.31 问题:使用套接字编写客户-服务器程序,实现客户-服务器交互计算.客户将三角形3个边的长度发给服务器,服务器把计算出的三角形的面积返回给客户. ...
- Java网络编程学习A轮_07_基于Buffer的Socket编程
示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...
- Winfrom 基于TCP的Socket 编程
基于TCP的Socket基础例子 服务端的代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); ...
随机推荐
- Effective Java 54 Use native methods judiciously
Java Native Interface(JNI) allows Java applications to call native methods, which are special method ...
- PS网页设计教程XXV——使用Photoshop设计的老式组合布局
作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...
- Java异常信息处理
import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.jun ...
- MyCat 学习笔记 第十篇.数据分片 之 ER分片
1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...
- 在AngularJS中实现自定义表单验证
除了一些已经定义好了的验证(例如 必填项.最小长度.最大长度)之外,更常用的,还是需要我们自己定义表单验证,这样才能对于项目中遇到的很多非常规问题给出自己的合适的解决方案. 在表单中控制变量 表单的属 ...
- [转]比NPOI更討喜的Excel元件-EPPlus
本文转自:http://blog.darkthread.net/post-2012-05-12-epplus.aspx 前陣子發表 [潛盾機]將檔案結構匯成Excel文件,從網友佑翔的留言(特此感謝) ...
- 【读书笔记《Android游戏编程之从零开始》】16.游戏开发基础(动画)
1. Animation动画 在Android 中,系统提供了动画类 Animation ,其中又分为四种动画效果: ● AlphaAnimation:透明度渐变动画 ● ScaleAnimati ...
- Zbrush遮罩边界该怎么实现羽化和锐化
很多情况下为了雕刻制图需要,在ZBrush®中不仅要使用边缘清晰的遮罩,有时还要将遮罩边缘变得模糊,做羽化效果.那么如何在ZBrush中实现羽化遮罩效果或锐化遮罩效果,本文将做详细讲解. 若有疑问可直 ...
- POJ 2449 Remmarguts' Date --K短路
题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
- maya获取邻接顶点的一个问题
maya网格数据结构允许"非流形"的存在,于是,这种数据结构无法按顺序给出一个点的邻接顶点. 于是,MItMeshVertex::getConnectedVertices函数返回的 ...