windows网络编程-2015.12.29
在windows环境下,使用netstat命令查看网络状态,具体命令如下所示:
netstat -ano | findstr listenport
在windows环境下,创建udp程序接收端,具体代码如下:
// Command line options:
// udp_server [-i:IP] [-p:port]
// -i:IP Local IP address to listen on
// -p:int Local port #include <string>
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib") const int DEFAULT_BUFFER_LENGTH = 4096; void Usage()
{
printf("usage: udp_server [-i:IP] [-p:port]\n");
printf(" -i:IP Local IP address to listen on\n");
printf(" -p:int Local port\n");
ExitProcess(1);
} struct AddrInfo
{
std::string ip;
int port;
}; AddrInfo GetInputAddrInfo(int argc, char **argv)
{
if(argc < 3)
{
Usage();
} AddrInfo addrInfo;
for(int i = 1; i < argc; i++)
{
if ((argv[i][0] == '-'))
{
switch (tolower(argv[i][1]))
{
case 'p': //port
if (strlen(argv[i]) > 3)
{
addrInfo.port = atoi(&argv[i][3]);
}
break;
case 'i': //ip
if (strlen(argv[i]) > 3)
{
addrInfo.ip = std::string(&argv[i][3]);
}
break;
default:
Usage();
break;
}
}
}
return addrInfo;
} int main(int argc, char **argv)
{
AddrInfo addrInfo = GetInputAddrInfo(argc, argv); WSADATA wsd;
if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
} SOCKET s;
if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("socket() failed; %d\n", WSAGetLastError());
return 1;
} SOCKADDR_IN local;
local.sin_family = AF_INET;
local.sin_port = htons((short)addrInfo.port);
local.sin_addr.s_addr = inet_addr(addrInfo.ip.c_str()); if (bind(s, (SOCKADDR *)&local, sizeof(local)) == SOCKET_ERROR)
{
printf("bind() failed: %d\n", WSAGetLastError());
return 1;
} char* recvBuf = (char*)malloc(DEFAULT_BUFFER_LENGTH);
if (recvBuf == NULL)
{
printf("GlobalAlloc() failed: %d\n", GetLastError());
return 1;
} SOCKADDR_IN sender; while(true)
{
int sendSize = sizeof(SOCKADDR_IN);
int ret = recvfrom(s, recvBuf, DEFAULT_BUFFER_LENGTH, 0, (SOCKADDR *)&sender, &sendSize);
if (ret == SOCKET_ERROR)
{
printf("recvfrom() failed; %d\n", WSAGetLastError());
break;
}
else if (ret == 0)
{
break;
}
else
{
recvBuf[ret] = '\0';
printf("[%s] send me [%s]\n", inet_ntoa(sender.sin_addr), recvBuf);
}
} closesocket(s);
free(recvBuf);
WSACleanup();
return 0;
}
运行上述程序,使用命令netstat -ano | findstr 8888,获得如下输出结果:
按照相同步骤,创建udp程序发送端,具体代码如下:
// Command line options:
// udp_client [-r:IP] [-p:port]
// -r:IP Recipient's IP address
// -p:int Remote port
// -n:x Number of times to send message #include <string>
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib") const char SEND_MESSAGE[] = "Hello world!"; void Usage()
{
printf("usage: udp_client [-r:IP] [-p:port] [-n:x]\n");
printf(" -r:IP Recipient's IP address\n");
printf(" -p:int Remote port\n");
printf(" -n:x Number of times to send message");
ExitProcess(1);
} struct InputInfo
{
std::string ip;
int port;
int sendTimes;
}; InputInfo GetInputInfo(int argc, char **argv)
{
if(argc < 4)
{
Usage();
} InputInfo inputInfo;
for(int i = 1; i < argc; i++)
{
if ((argv[i][0] == '-'))
{
switch (tolower(argv[i][1]))
{
case 'p': //port
if (strlen(argv[i]) > 3)
{
inputInfo.port = atoi(&argv[i][3]);
}
break;
case 'r': //ip
if (strlen(argv[i]) > 3)
{
inputInfo.ip = std::string(&argv[i][3]);
}
break;
case 'n': //Number of times to send message
if (strlen(argv[i]) > 3)
{
inputInfo.sendTimes = atol(&argv[i][3]);
}
break;
default:
Usage();
break;
}
}
} return inputInfo;
} int main(int argc, char **argv)
{
InputInfo inputInfo = GetInputInfo(argc, argv); WSADATA wsd;
if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
} SOCKET s;
if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("socket() failed; %d\n", WSAGetLastError());
return 1;
} SOCKADDR_IN recipient;
recipient.sin_family = AF_INET;
recipient.sin_port = htons((short)inputInfo.port);
recipient.sin_addr.s_addr = inet_addr(inputInfo.ip.c_str()); for(int i = 0; i < inputInfo.sendTimes; ++i)
{
int ret = sendto(s, SEND_MESSAGE, strlen(SEND_MESSAGE), 0, (SOCKADDR*)&recipient, sizeof(recipient));
if(ret == SOCKET_ERROR)
{
printf("sendto() failed, %d\n", WSAGetLastError());
break;
}
else if(ret == 0)
{
break;
}
else
{
printf("send [%s] to [%s]\n", std::string(SEND_MESSAGE, ret).c_str(), inet_ntoa(recipient.sin_addr));
}
} closesocket(s);
WSACleanup();
return 0;
}
windows网络编程-2015.12.29的更多相关文章
- 2015.12.29~2015.12.30真题回顾!-- HTML5学堂
2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停 ...
- [转]Windows网络编程学习-面向连接的编程方式
直接附上原文链接:windows 网络编程学习-面向连接的编程方式
- Windows网络编程 2 【转】
Windows网络编程使用winsock.Winsock是一个基于Socket模型的API,在Windows系统中广泛使用.使用Winsock进行网络编程需要包含头文件Winsock2.h,需要使用库 ...
- windows网络编程的一些理论
参考自<VC++深入详解> 这是我在看书时记录下来的东西. 注:下面的Socket其实都应该是socket 第14章网络编程 Socket是连接应用程序与网络驱动程序的桥梁,Socket在 ...
- Windows 网络编程
网络编程 API ,失败返回 -,错误代码 WSASYSNOTREADY 表示基础网络子系统没有准备好网络通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPRO ...
- Windows网络编程(C/C++服务器编程)
Windows服务器网络编程 Linux服务器网络编程
- windows 网络编程[转]
利用winsock编写网络应用程序服务端的步骤简述如下WSAStartup 初始化网络编程库 socket 创建套接字 bind 指定地址.端口,绑定套接字 listen 进入监听状态 accept ...
- Windows网络编程笔记4 -- Winsock 协议相关知识
Win32平台上的Winsock编程,Winsock是一个与协议无关的接口.以下协议是我们需要了解的: 网络协议的特征包括: 1. 面向消息 2. 面向连接和无线接 3. 可靠性和次序性 4. ...
- Windows网络编程笔记1
第一部分 传统网络API 传统的网络接口NetBIOS.重定向器.邮槽.命名管道等.第一,NetBIOS(Network Basic Input/Output System, NetBIOS)“网络基 ...
随机推荐
- 20160720-java高并发
https://www.zhihu.com/search?type=content&q=tomcat+%E8%83%BD%E6%94%AF%E6%8C%81%E5%A4%9A%E5%B0%91 ...
- 关于Cannot assign to 'self' outside of a method in the init family解决方法
有时候我们重写父类的init方法时不注意将init后面的第一个字母写成了小写,在这个方法里面又调用父类的初始化方法(self = [super init];)时会报错,错误信息如下:error:Can ...
- MongoDB的基本使用
use library 使用use函数切换已有的数据库或创建新的数据库 show dbs 查看MongoDB中目前所有可用的数据库 show collections 查看当前数据库中的所有集合 在集合 ...
- NeHe OpenGL教程 第三十五课:播放AVI
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java中的String与常量池
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- STM32中断控制及优先级设置
M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占:bit=0表示非抢占即子优先级:所以共有5中方案分组: 分组 Bit7 Bit6 Bit5 Bit4 说明: 第0组 ...
- java位运算
Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << ...
- Ubuntu 13.10 安装 ia32-lib
Ubuntu 13.10下面不参直接安装ia32-libs,直接安装的时候会提示下面的信息: output$ sudo apt-get install ia32-libs Reading packag ...
- windowns--HANDLE,
HANDLE: 在windows程序中,有各种各样的资源(窗口.图标.光标等),系统在创建这些资源时会为他们分配内存,并返回标示这些资源的标示号,即句柄. 句柄指的是一个核心对象在某一个进程中的唯一索 ...
- Spring配置项<context:annotation-config/>说明
配置applicationContext.xml时经常会看到: <context:annotation-config/> 它的作用是隐式地向Spring容器注册AutowiredAnnot ...