与TCP协议下编写服务端程序代码类似,但因为是无连接的形式,所以不需要监听。

  这次,我用了一点不同的想法:我建立一个服务端,用了两个端口和两个套接字,把服务端作为一个数据转发的中转站,使得客户机之间进行UDP协议下的通信。

  服务端代码:

/**
* UDP/IP 服务器端 Server.c
*/
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <time.h> #define true 1
#define false 0 #define BUFFSIZE 1024 int main(int argc, char**argv)
{
int Ret;
WSADATA wsaData;
SOCKET Socket_1;
SOCKET Socket_2;
SOCKADDR_IN ClientAddr_1;
int ClientAddr_1_Len = sizeof(ClientAddr_1);
SOCKADDR_IN ClientAddr_2;
int ClientAddr_2_Len = sizeof(ClientAddr_2);
unsigned short Port_1 = 5150;
unsigned short Port_2 = 8888;
char sendData[BUFFSIZE];
char recvData[BUFFSIZE]; if((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
printf("WSASTARTUP_ERROR: %d\n", Ret);
exit(1);
} if((Socket_1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
printf("Socket_1_ERROR\n");
exit(1);
}
//将端口变量从主机字节顺序转换位网络字节顺序
ClientAddr_1.sin_family = AF_INET;
ClientAddr_1.sin_port = htons(Port_1);
ClientAddr_1.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用bind将这个地址信息和套接字绑定起来
if(bind(Socket_1, (SOCKADDR *)&ClientAddr_1, ClientAddr_1_Len) == SOCKET_ERROR)
{
printf("BIND_SOCKET_1_ERROR: %d\n", SOCKET_ERROR);
exit(1);
} if((Socket_2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
printf("Socket_2_ERROR\n");
exit(1);
}
//将端口变量从主机字节顺序转换位网络字节顺序
ClientAddr_2.sin_family = AF_INET;
ClientAddr_2.sin_port = htons(Port_2);
ClientAddr_2.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用bind将这个地址信息和套接字绑定起来
if(bind(Socket_2, (SOCKADDR *)&ClientAddr_2, ClientAddr_2_Len) == SOCKET_ERROR)
{
printf("BIND_SOCKET_2_ERROR: %d\n", SOCKET_ERROR);
exit(1);
} printf("建立连接成功!"); //服务器作为中转站
//为两个IP之间互相转发消息
while(true)
{
//接收IP:192.168.1.2发送的数据
recvfrom(Socket_1, recvData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr_1, &ClientAddr_1_Len);
strcpy(sendData, recvData);
//转发数据给IP:192.168.1.6
if((Ret = sendto(Socket_2, sendData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr_2, ClientAddr_2_Len)) < 0)
printf("发送失败!\n"); //接收IP:192.168.1.6发送的数据
recvfrom(Socket_2, recvData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr_2, &ClientAddr_2_Len);
strcpy(sendData, recvData);
//转发数据给IP:192.168.1.2
if((Ret = sendto(Socket_1, sendData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr_1, ClientAddr_1_Len)) < 0)
printf("发送失败!\n");
}
closesocket(Socket_1);
closesocket(Socket_2); //应用程序完成对接的处理后,调用WSACleanup
if(WSACleanup() == SOCKET_ERROR)
{
printf("WSACLEANUP_ERROR: %d\n", WSAGetLastError());
exit(1);
} system("pause");
return 0;
}

  但会有个小问题,首先发送数据的客户端的数据无法接收,而且要运行成功必须先发送一个信息,再打开第二个客户端(步骤貌似是这样,前段时间写的了,忘记了...= =)

  客户端1代码:

/**
* UDP/IP 客户端 Client.c
*/
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h> #define true 1
#define false 0 #define BUFFSIZE 1024 int main(int argc, char**argv)
{
int Ret;
WSADATA wsaData;
SOCKET SendSocket;
SOCKADDR_IN ClientAddr;
int ClientAddrLen = sizeof(ClientAddr);
unsigned short Port = 5150;
char sendData[BUFFSIZE];
char recvData[BUFFSIZE];
time_t rawtime; if((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
printf("WSASTARTUP_ERROR: %d\n", Ret);
exit(1);
} if((SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
printf("SendSOCKET_ERROR\n");
exit(1);
} ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = htons(Port);
ClientAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.2");//本机IPv4地址 printf("连接到IP:%s 端口:%d\n", inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port));
puts("-----开始聊天!-----");
//这样的循环聊天算法硬生生的把UDP协议弄得和前面TCP协议的聊天程序一样了。。。
//感觉并不太能表现UDP和TCP的区别。。。但我暂时没有好办法
while(true)
{
//发送数据
printf("\nC.C.:");
scanf("%s", sendData);
strcat(sendData, "\t____");
time(&rawtime);
strcat(sendData, ctime(&rawtime));
if((Ret = sendto(SendSocket, sendData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr, ClientAddrLen)) < 0)
printf("发送失败!\n"); //接收数据
if((Ret = recvfrom(SendSocket, recvData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr, &ClientAddrLen)) >= 0)
printf("鲁鲁:%s\n", recvData);
else
printf("接收失败!\n");
}
closesocket(SendSocket); if(WSACleanup() == SOCKET_ERROR)
{
printf("WSACLEANUP_ERROR: %d\n", WSAGetLastError());
exit(1);
} system("pause");
return 0;
}

  按照思路即可编写客户端2的代码,代码也基本一样,就是端口号不能一样,需要对应服务端给定的另外一个端口号:

/**
* UDP/IP 客户端 Client.c
*/
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h> #define true 1
#define false 0 #define BUFFSIZE 1024 int main(int argc, char**argv)
{
int Ret;
WSADATA wsaData;
SOCKET SendSocket;
SOCKADDR_IN ClientAddr;
int ClientAddrLen = sizeof(ClientAddr);
unsigned short Port = 8888;
char sendData[BUFFSIZE];
char recvData[BUFFSIZE];
time_t rawtime; if((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
printf("WSASTARTUP_ERROR: %d\n", Ret);
exit(1);
} if((SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
printf("SendSOCKET_ERROR\n");
exit(1);
} ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = htons(Port);
ClientAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.2");/** 服务端程序的计算机的IPv4地址 */ printf("连接到IP:%s 端口:%d\n", inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port));
puts("-----开始聊天!-----");
while(true)
{
//接收数据
if((Ret = recvfrom(SendSocket, recvData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr, &ClientAddrLen)) >= 0)
printf("C.C.:%s\n", recvData);
else
printf("接收失败!\n"); //发送数据
printf("\n鲁鲁:");
scanf("%s", sendData);
strcat(sendData, "\t____");
time(&rawtime);
strcat(sendData, ctime(&rawtime));
if((Ret = sendto(SendSocket, sendData, BUFFSIZE, 0, (SOCKADDR*)&ClientAddr, ClientAddrLen)) < 0)
printf("发送失败!\n"); }
closesocket(SendSocket); if(WSACleanup() == SOCKET_ERROR)
{
printf("WSACLEANUP_ERROR: %d\n", WSAGetLastError());
exit(1);
} system("pause");
return 0;
}

windows网络编程-C语言实现简单的UDP协议聊天的更多相关文章

  1. windows网络编程-C语言实现简单的TCP协议聊天

    TCP/IP协议(面向连接协议)类似于打电话时,对方一定在手机附近并且此刻都在和对方进行通话.一定保证双方都在线,才能进行数据传输.UDP/IP协议(无连接协议)就像邮箱,不保证对方一定在等你邮件且对 ...

  2. UNP(一):网络编程角度下的TCP、UDP协议

    此博文是学习UNP(UNIX Network Programming)后的读书笔记,供以后自己翻阅回想知识. TCP.UDP概述 在前面<计算机网络与TCP/IP>栏目下已经介绍过一些关于 ...

  3. (网络编程)基于tcp(粘包问题) udp协议的套接字通信

    import   socket 1.通信套接字(1人1句)服务端和1个客户端 2.通信循环(1人多句)服务端和1个客户端 3.通信循环(多人(串行)多句)多个客户端(服务端服务死:1个客户端---&g ...

  4. {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习

    要求: 使用多线程实现多发送方发送数据到同一个接收者 代码: 发送端:可以在多台电脑上启动发送端,同时向接收端发送数据 注意:匹配地址和端口号 package com.qf.demo; import ...

  5. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

  6. Windows网络编程 2 【转】

    Windows网络编程使用winsock.Winsock是一个基于Socket模型的API,在Windows系统中广泛使用.使用Winsock进行网络编程需要包含头文件Winsock2.h,需要使用库 ...

  7. 【Hadoop离线基础总结】zookeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解

    ZooKeeper的介绍以及集群环境搭建.网络编程和RPC的简单了解 ZooKeeper介绍 概述 ZooKeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题.例如 ...

  8. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  9. Android网络编程要学的东西与Http协议学习

    本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...

随机推荐

  1. 「JSOI2015」symmetry

    「JSOI2015」symmetry 传送门 我们先考虑构造出原正方形经过 \(4\) 种轴对称变换以及 \(2\) 种旋转变换之后的正方形都构造出来,然后对所得的 \(7\) 个正方形都跑一遍二维哈 ...

  2. 请描述一下 cookies,sessionStorage 和 localStorage 的区别

    原文:http://blog.csdn.net/lxcao/article/details/52809939 相同点:都存储在客户端不同点: 1.存储大小 cookie数据大小不能超过4k. sess ...

  3. python-线程池的两种实现方式 【转载】

    #!/usr/bin/env python # -*- coding:utf-8 -*- import queue import threading import contextlib import ...

  4. 在ios微信客户端遇到的坑,input等错位

    1.判断移动端设备 // 处理iOS 微信客户端弹窗状态下调起输入法后关闭输入法页面元素错位解决办法 var ua = window.navigator.userAgent.toLowerCase() ...

  5. C语言 排序算法

    冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来. 过程演示: 选 ...

  6. SIMS(secondary ion mass spectroscopy)二次离子质谱

    1.仪器介绍 二次离子质谱(SIMS)是一种用于通过用聚焦的一次离子束溅射样品表面并收集和分析喷射的二次离子来分析固体表面和薄膜的组成的技术.SIMS是最灵敏的表面分析技术,元素检测限为百万分之几到十 ...

  7. Shiro入门学习之shi.ini实现认证及源码分析(二)

    一.Shiro.ini文件 1.文件说明 ①ini(InitializationFile)初始文件:Window系统文件扩展名 ②Shiro使用时可以连接数据库,也可以不连接数据库(可以使用shiro ...

  8. cnblogs 自定义主题字体渲染方案

    渲染效果图 由于我一直偏好衬线字体,所以在采用 Silence 主题 之后,还参照谢益辉的博客字体方案进行了改进 首先,在页首代码中添加盘古之白,如果你同时编写 中/英 文博客,你当然应该学习谢益辉的 ...

  9. ZOJ4104 Sequence in the Pocket(2019浙江省赛)

    思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main ( ...

  10. 26 JavaScript HTML DOM简介&方法&文档

    HTML DOM: Document  Object  Model 文档对象模型.是HTML的标准对象模型和编程接口.(JavaScript只是可以操作HTML DOM的语言之一) 定义了HTML元素 ...