编程模型
一、 基于 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
本文详细介绍了在Windows操作系统中进行网络编程的过程,包括如何建立和关闭网络连接。

被折叠的 条评论
为什么被折叠?



