winsocket <研究了一天的成果>
首先,这都是套路( ▼-▼ )

头文件 #include <WinSock.h>
#include <Winsock2.h> 用这个,这个是升级版
各个函数解释
1、WSAStartup:
初始化套接字环境,本函数必须是应用程序或DLL调用的第一个Windows Sockets函数.它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节.应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数.
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
实际用例
//begin 初始化网络环境
int err = WSAStartup(MAKEWORD(, ), &wsaData);
if ( err != )
{
printf("WSAStartup failed with error: %d\n", err);
return -;
}//end
2、WSACleanup:
清理套接字环境,和上面的WSAStartup相反,该函数是在程序不在对任何Windows Sockets函数调用后,用其来清理套接字环境的
int WSACleanup (void);
//begin socket 一个套接字
hTcpSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == hTcpSocket)
{
MJS_LOG_ERROR("socket failed with error: \n");
WSACleanup();
return - ;
}//end
4、int listen(SOCKET s, int backlog);
将套接字置入监听模式并准备接受连接请求。其中,参数s是服务器端套接字,于指定正在等待连接的最大队列长度。如无错误发生,listen函数返回0,失败则返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
int ServePort=;
char ServeIP[]="192.168.1.200";
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(ServePort);
addr.sin_addr.S_un.S_addr = inet_addr(ServeIP);
//连接服务器
if (connect(hTcpSocket, (sockaddr*)&addr, sizeof(sockaddr)) == -)
{
closesocket(hTcpSocket);
printf("connect Tradesys failed with error%d,%s,%d: \n",ServePort,ServeIP,GetLastError());
WSACleanup();
return -;
}
else
{
printf("connect Tradesys sucessed,%d,%s: \n",ServePort,ServeIP);
}
若无错误发生,则connect()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。对阻塞套接口而言,若返回值为SOCKET_ERROR则应用程序调用WSAGetLsatError()。如果它指出错误代码为WSAEWOULDBLOCK,则您的应用程序可以:
失败时返回 -1/SOCKET_ERROR
sockfd:已建立连接的发送端套接字描述符(非监听描述符)
buf:应用要发送数据的缓存
len:实际要发送的数据长度
flags:一般设置为0。 flags可取的值有:0、MSG_DONTROUTE或MSG_OOB或这些标志的按位或运算。
表示从接收缓冲区拷贝数据。成功时,返回拷贝的字节数,失败返回-1。阻塞模式下,recv/recvfrom将会阻塞到缓冲区里至少有一个字节(TCP)/至少有一个完整的UDP数据报才返回,没有数据时处于休眠状态。若非阻塞,则立即返回,有数据则返回拷贝的数据大小,否则返回错误-1,置错误码为EWOULDBLOCK。
hostent结构:
struct hostent
{
char *h_name; //*h_name 表示的是主机的规范名
char **h_aliases; //h_aliases 表示的是主机的别名
int h_addrtype; //地址类型AF_INET,还是AF_INET6
int h_length; //IP地址占字节数
char **h_addr_list; //IP地址列表
};
int **h_addr_lisst 表示的是主机的ip地址 注意 是以网络字节序存储的。
14、const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) ;
这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。
参数in:一个表示Internet主机地址的结构。
返回值:若无错误发生,inet_ntoa()返回一个字符指针。否则的话,返回NVLL。其中的数据应在下一个WINDOWS套接口调用前复制出来。
//将主机的unsigned long值转化为网络字节顺序(32位),使用函数htonl()
//参数hostlong标识主机字节顺序的数字,函数返回一个网络字节顺序的数字
#include <winsock.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")
void main()
{
u_long a = 0x12345678;
u_long b = htonl(a);
printf("%u/n",a);
printf("%x/n",a);
printf("%u/n",b);
printf("%x/n",b);
}
21、u_long PASCAL FAR ntohl( u_long netlong);
将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
参数netlong:一个以网络字节顺序表达的32位数。
返回值:ntohl()返回一个以主机字节顺序表达的数。
//将32位网络字节转换为主机字节,使用函数ntohl()
//定义如下
u_long ntohl(u_long netlong);
#include <WINSOCK2.H>
#include
<stdio.h>
#pragma comment(lib,"ws2_32.lib")
void
main()
{
u_long a = 0x12345678;
u_long b =
ntohl(a);
printf("%u/n",a);
printf("%x/n",a);
printf("%u/n",b);
printf("%x/n",b);
}
PS:
INADDR_ANY 就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。
以下是我写的代码
server:
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib") #define PORT 8888
int main()
{
//begin 初始化网络环境
WSADATA wsaData;
if(WSAStartup(MAKEWORD(,),&wsaData)!=){ //加载winsock2库
printf("加载失败./n");
return -;
}
//end 初始化网络环境 struct sockaddr_in servaddr; //服务器端地址
memset(&servaddr, ,sizeof(servaddr));
servaddr.sin_family = AF_INET; //填写要连接的服务器地址信息
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr()将命令行中输入的点分IP地址转换为二进制表示的网络字节序IP地址
servaddr.sin_port = htons(PORT); SOCKET socks = socket(AF_INET,SOCK_STREAM,); //建立客户端流式套接口
if(socks == INVALID_SOCKET){
printf("建立接口失败/n");
return -;
} bind(socks,(struct sockaddr *)&servaddr,sizeof(servaddr)); //与服务器端建立连接
listen(socks, ); //将套接字置入监听模式并准备接受连接请求,请求10是连接队列的最大长度
printf("正在连接......\n"); struct sockaddr_in addrClient; int addrClient_len = sizeof(addrClient);
while () {
SOCKET sockc = accept(socks, (struct sockaddr *)&addrClient, &addrClient_len); //建立套接字用于通信
char sen[] = {};
sprintf(sen,"%s", inet_ntoa(addrClient.sin_addr)); // 将客户端的IP地址存入c数组中
send(sockc, sen, strlen(sen) + , ); // 发送数据到客户端 char receive[] = {};
recv(sockc, receive, , ); // 接收客户端数据
printf("%s\n", receive); closesocket(sockc);
}
closesocket(socks);
system("pause");
return ;
}
client:
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define PORT 8888
int main()
{
//begin 初始化网络环境
WSADATA wsaData;
if(WSAStartup(MAKEWORD(,),&wsaData)!=){ //加载winsock2库
printf("加载失败/n");
return -;
}
//end 初始化网络环境 struct sockaddr_in addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(PORT);
addrSrv.sin_addr.s_addr = inet_addr("10.22.26.126"); //要连接的服务器的ip地址 SOCKET sockc = socket(AF_INET,SOCK_STREAM,); //建立客户端流式套接口
connect(sockc,(struct sockaddr *)&addrSrv,sizeof(addrSrv)); //与服务器进行连接
char receive[] = {};
recv(sockc, receive, , ); // 接收客户端数据
printf("%s\n", receive);
send(sockc, "hello world", strlen("hello world") + , );
closesocket(sockc);
system("pause");
return ;
}
分别建两个项目,然后打开各自的exe即可

winsocket <研究了一天的成果>的更多相关文章
- Slam(即时定位与地图构建) 知识篇
Slam即时定位与地图构建 技术解释 同步定位与地图构建(SLAM或Simultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过 ...
- paper 119:[转]图像处理中不适定问题-图像建模与反问题处理
图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...
- 神经网络训练中的Tricks之高效BP(反向传播算法)
神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...
- [转载]WEB缓存技术概述
[原文地址]http://www.hbjjrb.com/Jishu/ASP/201110/319372.html 引言 WWW是互联网上最受欢迎的应用之一,其快速增长造成网络拥塞和服务器超载,导致客户 ...
- 科普:WiFi是谁申请的专利?高通吗?错!
你给Wi-Fi交过专利费吗?你知道Wi-Fi是谁申请的专利吗? 答:肯定是高通! 错! Wi-Fi技术由澳洲政府的研究机构CSIRO在90年代发明并于1996年在美国成功申请了无线网技术专利.(US ...
- STL笔记(2) STL之父访谈录
年3月,dr.dobb's journal特约记者, 著名技术书籍作家al stevens采访了stl创始人alexander stepanov. 这份访谈纪录是迄今为止对于stl发展历史的最完备介绍 ...
- owin 中间件 katana 如何解密cookie
.NET MVC5 默认的用户登录组件是AspNet.Identity ,支持owin,并且微软自己实现的一套owin 中间件叫 katana 补充一下 katana项目源码地址:https://ka ...
- cv 论文(CNN相关)
最近发现很多以前看的论文都忘了,所以想写点东西来整理下之前的paper,paper主要是cv(computer vision)方向的. 第一篇:Gradient-based learning appl ...
- (原创)speex与wav格式音频文件的互相转换
我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...
随机推荐
- win7添加usb3.0驱动(错误代码1392,文件或目录损坏且无法读取)
Win7添加usb3.0驱动 之前一直按照网上的方法执行dism命令挂载时,总是失败,错误代码1392,显示原因是文件或目录损坏且无法读取.这个错误以前在装机时老是出现导致系统安装不成功,在BIOS中 ...
- apache将请求转发到到tomcat应用
映射: 1.开启apache中的proxy模块(proxy.conf,proxy.load,proxy_http.load) 2.配置apache配置文件,<VirtualHost *:80&g ...
- Linux免SSH密码登录
SSH免密码登录,做个总结吧! 1.安装SSH服务(略过) 2.场景:需要配置主机A无密码登录主机B 在主机A上执行如下: cd ~/.ssh ssh-keygen -t rsa 生成密钥文件 cp ...
- 串口屏之------Usart GPU 使用手册
Usart GPU 使用手册 文档更新日期 更新内容 2014-9-10 C编程sprintf问题 2014-8-8 版本程序1.0,升级了自定义波特率部分 ------ 原始版本 第一部分:基础应用 ...
- CRC校验源码分析
这两天做项目,需要用到 CRC 校验.以前没搞过这东东,以为挺简单的.结果看看别人提供的汇编源程序,居然看不懂.花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省 ...
- 【转】Device Tree(二):基本概念
原文网址:http://www.wowotech.net/linux_kenrel/dt_basic_concept.html 一.前言 一些背景知识(例如:为何要引入Device Tree,这个机制 ...
- 2013第49周一jsp标签
2013第49周一jsp标签 今天在调试一些前台页面上的问题,在处理structs标签.jstl标签时遇到了些麻烦,为了调用后台数据字典中的类方法,开始在<c:forEach>中尝试怎么样 ...
- soj 1700 ping_简单dp
题目链接 题意:给你一个无向图,求n边的最短路 思路:用最短路想了半天都没想出来,比赛结束回去看看原来用dp做,我的dp有待提高啊 sp[i][k]=min(sp[j][k-1]+dp[j][i])/ ...
- OpenStack术语名词及问题调试
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnoAAAEkCAIAAAA3pAtBAAAgAElEQVR4nOy953tUx7o9uCrt2EmtHB
- MSDN中HttpWebRequest/HttpWebResponse用法
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://home.cnblogs.com/u/weiweiboqi/ ...