当前位置: 首页 > article >正文

Windows 网络编程

编程模型
一、 基于 TCP -- 服务器
1,创建一个 socket ,用函数 socket() ;
2,绑定 IP 地址、端口等信息到 socket 上,用函数 bind() ;
3,设置允许的最大连接数,用函数 listen() ;
4,等待来自客户端的连接请求,用函数 accept() ;
5,收发数据, 用函数 send() 和 recv(),或者 read() 和 write() ;
6,关闭网络连接 (先关闭和客户端的连接,在关闭本地socket)。
    基于 TCP -- 客户端
1,创建一个 socket ,用函数 socket() ;
2,设置要连接的服务器的 IP 地址和端口等属性 ;
3,连接服务器,用函数 connect() ;
4,收发数据, 用函数 send() 和 recv(),或者 read() 和 write() ;
5,关闭网络连接 。

 二、基于 UDP -- 服务器
1,创建一个 socket,用函数 socket() ;
2,绑定 IP 地址、端口等信息到 socket 上,用函数 bind() ;
3,循环接收数据,用函数 recvfrom() , 发送数据用 sendto() 。
4,关闭网络连接。
    基于 UDP -- 客户端
1,创建一个 socket,用函数 socket() ;
2,设置对方的 IP 地址和端口等属性 ;
3,发送数据,用函数 sendto() ,接收数据用 recvfrom()  ;

4,关闭网络连接。


/*
* Copyright (c) 2014, Mr. Li
* All rights reserved.
*
* 文件名称:main.cpp
* 文件标识:网络编程
* 摘    要:Socket网络编程,UDP Sever端程序
* 其他说明:
*
* 当前版本:1.0
* 作    者:XXX
* 日    期:2014-07-30
*
* 修改记录1:
*     修改日期:
*     版 本 号:
*     修 改 人:
*     修改内容:
*
* 修改记录2:...
*/#ifdef __cplusplus
extern "C" {
#endif#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <WinSock2.h>/************************************************************************/
/* Win32 Socket依赖库                                                   */
/************************************************************************/
#pragma  comment(lib, "Ws2_32.lib")/************************************************************************/
/* 相关宏定义                                                           */
/************************************************************************/
#define trace(str)  printf(">>%s\n",str)
#define SEVER_PORT  3456/*
* 函数名称:getline
* 功    能:从终端获得一行文本。
* 输入参数:str 字符串首地址
* 输出参数:str 获得文本的首地址
* 返 回 值:获得文本的首地址
* 其他说明:
* 作    者:XXX
* 日    期:2014-07-30
*/
const char* getline(char* str)
{assert(str != NULL);const char* pstr = str;do {scanf_s("%c", str);} while (*str++ != '\n');*(--str) = '\0';return pstr;
}/*
* 函数名称:main
* 功    能:主函数
* 输入参数:
* 输出参数:
* 返 回 值:
* 其他说明:
* 作    者:XXX
* 日    期:2014-07-30
*/int main()
{WSAData lcwsadata;SOCKET lcsocket;SOCKADDR_IN lcskaddr, netskaddr;char rxtxbuf[512];int netskaddrlg = sizeof(netskaddr);memset(rxtxbuf, 0, sizeof(rxtxbuf));memset(&netskaddr, 0, sizeof(netskaddr));	memset(&lcskaddr, 0, sizeof(lcskaddr));if (0 != WSAStartup(MAKEWORD(1,1), &lcwsadata)){trace("WSAStartup error.");WSACleanup();return WSAGetLastError();}lcsocket = socket(AF_INET, SOCK_DGRAM, 0);if (lcsocket == INVALID_SOCKET){trace("socket error.");WSACleanup();return WSAGetLastError();}lcskaddr.sin_family = AF_INET;lcskaddr.sin_addr.s_addr = htonl(INADDR_ANY);lcskaddr.sin_port = htons(SEVER_PORT);if (0 != bind(lcsocket, (SOCKADDR*)&lcskaddr, sizeof(lcskaddr))){trace("bind error.");closesocket(lcsocket);WSACleanup();return WSAGetLastError();}while (0 != strcmp(rxtxbuf, "Exit")){memset(rxtxbuf, 0, sizeof(rxtxbuf));trace("Sever Recving...");if( -1 == recvfrom(lcsocket,rxtxbuf, 128, 0, (SOCKADDR*)&netskaddr, &netskaddrlg)){trace("recvfrom error.");closesocket(lcsocket);WSACleanup();return WSAGetLastError();}printf(">>Recvfrom Client : %s : %s\n", inet_ntoa(netskaddr.sin_addr), rxtxbuf);printf(">>Sever Input Responses Words : ");getline(rxtxbuf);if (SOCKET_ERROR == sendto(lcsocket, rxtxbuf, strlen(rxtxbuf)+1, 0,(SOCKADDR*)&netskaddr, netskaddrlg)){trace("sendto error.");closesocket(lcsocket);WSACleanup();return WSAGetLastError();}		}closesocket(lcsocket);WSACleanup();return 0;
}#ifdef __cplusplus
};
#endif
/*
* Copyright (c) 2014, Mr. Li
* All rights reserved.
*
* 文件名称:main.cpp
* 文件标识:网络编程
* 摘    要:Socket网络编程,UDP Client端程序
* 其他说明:
*
* 当前版本:1.0
* 作    者:XXX
* 日    期:2014-07-30
*
* 修改记录1:
*     修改日期:
*     版 本 号:
*     修 改 人:
*     修改内容:
*
* 修改记录2:...
*/
#ifdef __cplusplus
extern "C" {
#endif#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <WinSock2.h>/************************************************************************/
/* Win32 Socket依赖库                                                   */
/************************************************************************/
#pragma  comment(lib, "Ws2_32.lib")/************************************************************************/
/* 相关宏定义                                                           */
/************************************************************************/
#define trace(str)  printf(">>%s\n",str)
#define SEVER_PORT  3456
#define SEVER_IP_ADDR "192.168.5.62"/*
* 函数名称:getline
* 功    能:从终端获得一行文本。
* 输入参数:str 字符串首地址
* 输出参数:str 获得文本的首地址
* 返 回 值:获得文本的首地址
* 其他说明:
* 作    者:XXX
* 日    期:2014-07-30
*/
const char* getline(char* str)
{assert(str != NULL);const char* pstr = str;do {scanf_s("%c", str);} while (*str++ != '\n');*(--str) = '\0';return pstr;
}/*
* 函数名称:main
* 功    能:主函数
* 输入参数:
* 输出参数:
* 返 回 值:
* 其他说明:
* 作    者:XXX
* 日    期:2014-07-30
*/
int main()
{WSAData lcwsadata;SOCKET lcsocket;SOCKADDR_IN netskaddr;char rxtxbuf[256];int netskaddrlg = sizeof(netskaddr);memset(rxtxbuf, 0, sizeof(rxtxbuf));memset(&netskaddr, 0, sizeof(netskaddr));if (0 != WSAStartup(MAKEWORD(1,1), &lcwsadata)){trace("WSAStartup error.");WSACleanup();return WSAGetLastError();}lcsocket = socket(AF_INET, SOCK_DGRAM, 0);if (lcsocket == INVALID_SOCKET){trace("socket error.");WSACleanup();return WSAGetLastError();}netskaddr.sin_family = AF_INET;netskaddr.sin_addr.s_addr = inet_addr(SEVER_IP_ADDR);netskaddr.sin_port = htons(SEVER_PORT);while (0 != strcmp(rxtxbuf, "Exit")){memset(rxtxbuf, 0, sizeof(rxtxbuf));printf(">>Client Input send Words : ");if (0 == strcmp(getline(rxtxbuf), "Exit")){break;}if (SOCKET_ERROR == sendto(lcsocket, rxtxbuf, strlen(rxtxbuf)+1, 0,(SOCKADDR*)&netskaddr, netskaddrlg)){trace("sendto error.");closesocket(lcsocket);WSACleanup();return WSAGetLastError();}memset(rxtxbuf, 0, sizeof(rxtxbuf));trace("Client Recving...");if( -1 == recvfrom(lcsocket,rxtxbuf, 128, 0, (SOCKADDR*)&netskaddr, &netskaddrlg)){trace("recvfrom error.");closesocket(lcsocket);WSACleanup();return WSAGetLastError();}printf(">>Recvfrom Client : %s : %s\n", inet_ntoa(netskaddr.sin_addr), rxtxbuf);}closesocket(lcsocket);WSACleanup();return 0;
}#ifdef __cplusplus
};
#endif




http://www.lryc.cn/news/2418802.html

相关文章:

  • 各种TCP端口详细说明中文版
  • 硬件工程师需要学习哪些知识
  • Linux下7.3虚拟机的完整封装
  • 马云语录——经典!
  • 戴尔笔记本开机logo进度条时间长的解决办法
  • 总结 vb与数据库的连接方法
  • 李开复--生命是最严厉的导师
  • 虐杀原形2闪退、prototype2打开闪退,无法运行解决办法
  • php配置文件详解(phg.ini php-fpm.conf)
  • 破解WEP加密
  • 笔记《白帽子讲Web安全》吴翰清
  • 微信公众帐号中使用的QQ表情代码对照表
  • 奶粉卖到“全球最贵”,飞鹤却陷入“中年危机”
  • 项目实战:ASP.NET:C/S架构 大学BBS论坛项目(推荐★★★)
  • 上海市历年平均工资及社保基数
  • 【Socket网络编程】1.bind()和 INADDR_ANY 解析
  • 乔布斯生母不知儿子去世
  • sd敢达g世纪android,SD敢达G世纪 世界/超越世界 安卓模拟器金手指代码亲测有用...
  • 1000BASE-T、1000BASE-TX、1000BASE-X的区别
  • html+css+js网页制作 淘宝首页1个页面带js 大学生HTML5期末作业 Web前端网页制作 html5+css3+js
  • 免费php国外商,转载-四个免费的国外php主机服务
  • 智能设备项目:将程序生成CAB文件 并将CAB部署到PocketPC等仿真设备
  • android应用程序的签名(Signature)
  • 搭建WebService简易框架示例
  • MFC开发之设置菜单项为不可用(ListControl右键菜单其中某项不可用)
  • 锐捷 重启计算机,win7系统锐捷客户端总是提示重启计算机后才能使用的解决方法...
  • Motorola XOOM平板电脑(wingray)刷机方法
  • root了有什么好,手机root好嘛
  • 关于依赖服务或组无法启动解决方案解析
  • 深入探讨 C# 中 [AjaxPro.AjaxMethod] 的使用与优化