一个简单的Windows下的socket程序
服务器端代码server.cpp:
#include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll int main() { //初始化DLL /************************************************************************/ /*调用WSAStartup()函数进行初始化,并指明要使用的版本号 */ /************************************************************************/ WSADATA wsaData; WSAStartup(MAKEWORD(,),&wsaData); //主版本号为2,副版本号为2,返回0x0202 //创建套接字 /************************************************************************/ /*Windows下使用的socket()函数来创建套接字,原型为: SOCKET socket(int af,int type,int protocol); 1)af为地址族(Address Family),也就是IP地址类型,常用的有AF_INET(表示IPv4地址)和AF_INET6(表示IPv6地址)。 AF是“Address Family”的简写,INET是“Internet”的简写。 也可以使用PF前缀,PF是“Protocol Family”的简写,它和AF是一样的。PF_INET等价于AF_INET,PF_INET6等价于AF_INET6 2)type为数据传输方式,常用的有SOCK_STREAM(面向连接的数据传输方式)和SOCK_DGRAM(无连接的数据传输方式) 3)protocol表示传输协议,常用的有IPPROTO_TCP和IPPTOTO_UDP,分别表示TCP传输协议和UDP传输协议 */ /************************************************************************/ SOCKET servSock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); //创建TCP套接字,返回SOCKET类型的句柄 //绑定套接字 /************************************************************************/ /*bind()函数的原型为: int bind(SOCKET sock,const struct sockaddr *addr,int addrlen); //Windows 1)sock为socket文件句柄,addr为sockaddr结构体变量的指针,addrlen为addr变量的大小,可由sizeof()计算得出 2)这里使用sockaddr_in结构体,然后再强制转换为SOCKADDR类型。可以认为,SOCKADDR是一种通用的结构体,可以用来 保存多种类型的IP地址和端口号,而sockaddr_in是专门用来保存IPv4地址的结构体。 */ /************************************************************************/ sockaddr_in sockAddr; memset(&sockAddr,,sizeof(sockAddr)); //每个字节都用0填充 sockAddr.sin_family=PF_INET; //使用IPv4地址 sockAddr.sin_addr.s_addr=inet_addr("127.0.0.1"); //具体的IP地址(s_addr是一个整数, //而IP地址是一个字符串,所以需要inet_addr()函数进行转换) sockAddr.sin_port=htons(); //端口 //(理论上端口号的取值范围为0-65536,但0-1023的端口一般由系统分配给特定的服务程序, //例如Wed服务的端口号为80,FTP服务的端口号为21,所以我们的程序要尽量在1024-65536之间分配端口号 //端口号需要用htons()函数转换) bind(servSock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR)); //将套接字和IP、端口绑定 //进入监听状态 /************************************************************************/ /*对于服务端程序,使用bind()绑定套接字后,还需要使用listen()函数让套接字进入被动监听 状态,再调用accept()函数,就可以随时响应客户端的请求了 通过listen()函数可以让套接字进入被动监听状态,它的原型为: int listen(SOCKET sock,int backlog); //Windows sock为需要进入监听状态的套接字,backlog为请求队列的最大长度 */ /************************************************************************/ listen(servSock,); //接收客户端请求 /************************************************************************/ /*当套接字处于监听状态时,可以通过accept()函数来接收客户端请求,它的原型为: SOCKET accept(SOCKET sock,struct sockaddr *addr,int *addrlen); //Windows sock为服务端套接字,addr为sockaddr结构体变量,addrlen为参数addr的长度,可由sizeof()求得。 accept()返回一个新的套接字来和客户端通信,addr保存了客户端的IP地址和端口号,而sock是服务器端的套接字。 后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。 listen()只是让套接字进入监听状态,并没有真正接收客户端请求,listen()后面的代码会继续执行,直到 遇到accept()。accept()会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。 */ /************************************************************************/ SOCKADDR clntAddr; int nSize=sizeof(SOCKADDR); SOCKET clntSock=accept(servSock,(SOCKADDR*)&clntAddr,&nSize); //向客户端发送数据 /************************************************************************/ /*从服务器端发送数据使用send()函数,它的原型为: int send(SOCKET sock,const char *buf,int len,int flags); sock为要发送数据的套接字,buf为要发送的数据的缓冲区地址,len为要发送的数据的字节数,flags为要 发送数据时的选项。 最后的flags参数一般设置为0或NULL。 */ /************************************************************************/ char *str="Hello World!"; send(clntSock,str,strlen(str)+sizeof(char),NULL); //关闭套接字 closesocket(clntSock); closesocket(servSock); //终止DLL的使用 WSACleanup(); ; }
客户端代码client.cpp:
#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll int main() { //初始化DLL WSADATA wsaData; WSAStartup(MAKEWORD(,),&wsaData); //创建套接字 SOCKET sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); //向服务器发起请求 sockaddr_in sockAddr; memset(&sockAddr,,sizeof(sockAddr)); //每个字节都用0填充 sockAddr.sin_family=PF_INET; sockAddr.sin_addr.s_addr=inet_addr("127.0.0.1"); sockAddr.sin_port=htons(); /************************************************************************/ /*connect()函数用来建立连接,它的原型为: int connect(SOCKET sock,const struct sockaddr *serv_addr,int addrlen); //Windows */ /************************************************************************/ connect(sock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR)); //接收服务器传回的数据 }; /************************************************************************/ /*在客户端接收数据使用recv()函数,它的原型为: int recv(SOCKET sock,char *buf,int len,int flags); */ /************************************************************************/ recv(sock,szBuffer,MAXBYTE,NULL); //输出接收到的数据 printf("Message from server: %s\n",szBuffer); //关闭套接字 closesocket(sock); //终止使用DLL WSACleanup(); system("pause"); ; }
一个简单的Windows下的socket程序的更多相关文章
- gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)
cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- 使用Code::blocks在windows下写网络程序
使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...
- # 如何在Windows下运行Linux程序
如何在Windows下运行Linux程序 一.搭建 Linux 环境 1.1 安装 VMware Workstation https://www.aliyundrive.com/s/TvuMyFdTs ...
- Windows下,通过程序设置全屏抗锯齿(多重采样)的方法
这里说的全屏抗锯齿,不是基于着色器的FXAA之类的方式,而是兼容性更好的,基于固定管线的多重采样方式. 先来说一下开发环境,我用的是VC2013+GLEW1.11. 要通过程序设置多重采样,首先需要进 ...
- java最简单的知识之创建一个简单的windows窗口,利用Frame类
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一下 ...
- [MapReduce_add_1] Windows 下开发 MapReduce 程序部署到集群
0. 说明 Windows 下开发 MapReduce 程序部署到集群 1. 前提 在本地开发的时候保证 resource 中包含以下配置文件,从集群的配置文件中拷贝 在 resource 中新建 ...
随机推荐
- 查linux端口连接情况用命令netstat
查linux端口连接情况用命令netstat netstat -apn |grep cdnbest 或netstat –apn | grep 3320
- C# 以管理员身份运行WinForm程序
最近帮客户开发的WinForm客户端,部分在使用的过程中,会出现“系统文件找不到”的错误提示. 调试后,确定为程序在操作配置文件时,系统权限引起的错误,直接管理员权限运行就正常了. 考虑用户操作的便利 ...
- 【POJ3691】DNA repair(AC自动机,DP)
题意: 生物课上我们学到,DNA序列中只有A, C, T和G四种片段. 经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段"ATC"是不好片段,则"AGATC ...
- 纯css来画图-border应用
基础知识: Css画图大部分是使用了css中的border来绘画图形,那首先我们就来看下border的基础知识,至于其他的遇到了再讲吧! Border的基础知识: 一般我们这样简写: border: ...
- php js => splice 数组 插入 功能
php array_splice 手册详解 array_splice - 把数组中的一部分去掉并用其它值取代 参数 input 输入的数组. offset 如果 offset 为正,则从 i ...
- 使用PS过程
1. 设置图层背景色和前景色 设置背景色和前景色方法类似,下面以设置背景色为例说明.方法一:使用色板设置图片背景色第一步:单击"文件"菜单,选择"新建文档",这 ...
- 转:union和union all的区别
Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All 两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- aspx页面,中文乱码解决方案
由于文件编码方式编码方式不统一出现样式中文乱码解决方案: 今天碰到的问题:页面字体样式设置的'微软雅黑',可页面没引用.我调试看到样式出现中文乱码了 这种问题,就需要转换文件的编码方式,如下两步即可解 ...
- Lucene教程(转)
Lucene教程 1 lucene简介1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来 ...