Windows 网络编程

本文详细介绍了在Windows操作系统中进行网络编程的过程,包括如何建立和关闭网络连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程模型
一、 基于 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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值