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