基于UDP的Sockets编程

当程序创建套接字句柄成功后,便可以直接调用函数进行数据收发,最后,关闭套接字对象。

在UDP中进行数据收发的函数时sendto()和recvfrom()。

int sendto(
		SOCKET s,                            //套接字句柄
		const char FAR* buf,                //数据缓冲区
		int len,                            //数据的长度
		int flags,                          //一般设置成0
		const struct sockaddr FAR* to,      //目标地址结构信息
		int tolen                           //目标地址结构大小
		);
	int recvfrom(SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen);
	参数from是指向地址结构sockaddr_in的指针,表示数据发送方的地址信息,参数fromlen表示该地址结构的大小。

UDO服务器:

// TCP服务器.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>

#pragma comment(lib, "WS2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{

	WSADATA data;   
	WORD w = MAKEWORD(2, 0);                            //定义版本号码
	char sztext[] = ("welcome yuippe\r\n");
	::WSAStartup(w, &data);                             //初始化套接字库
	SOCKET s;                                           //定义套接字句柄
	s = ::socket(AF_INET, SOCK_DGRAM, 0);            //创建TCP套接字
	sockaddr_in addr, addr2;                          //定义套接字地址结构
	int n = sizeof(addr2);                           //获取套接字地址结构大小
	char buff[100] = {0};                             //接收数据缓冲区
	addr.sin_family = AF_INET;                       //初始化地址结构
	addr.sin_port = htons(75);
	addr.sin_addr.S_un.S_addr = INADDR_ANY;
	::bind(s, (sockaddr*)&addr, sizeof(addr));
	printf("UDP服务器已经启动\r\n");
  while(1){
	if (::recvfrom(s, buff, 100, 0, (sockaddr*)&addr2, &n) != -1) //接收客户端信息
	{
		printf("%s已经连接上\r\n", inet_ntoa(addr2.sin_addr));
		printf("%s\r\n", buff);
		::sendto(s, sztext, sizeof(sztext), 0, (sockaddr*)&addr2, n);
		
	}}
::closesocket(s);
		::WSACleanup();
if (getchar()){return 0;}else{::Sleep(100);}return 0;}


UDP客户端:

// TCP客户端.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>


#pragma comment(lib, "WS2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{

	WSADATA data;
	WORD w = MAKEWORD(2, 0);
	::WSAStartup(w, &data);
	SOCKET s;
	char sztext[] = "服务器,你好!\r\n";
	s = ::socket(AF_INET, SOCK_DGRAM, 0);
	sockaddr_in addr, addr2;
	int n = sizeof(addr2);
	char buff[100] = {0};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(75);
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	printf("UDP客户端已经启动\r\n");
	
	if(::sendto(s, sztext, sizeof(sztext), 0, (sockaddr*)&addr, n) != 0)
	{
		::recvfrom(s, buff, 100, 0, (sockaddr*)&addr2, &n);
		printf("服务器说: %s\r\n", buff);
	}

	::closesocket(s);
	::WSACleanup();
	if (getchar())
	{
		return 0;
	}
	else
	{
		::Sleep(100);
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值