【tcp-ip学习总结】基础UDP实现的简单通信功能小程序
2015-04-22 19:18
1116 查看
环境:VS2013
#include<Winsock2.h> #include<stdio.h> #include<stdlib.h> #pragma comment(lib,"ws2_32.lib") #define DEFAULT_PORT 8888 #define BUFFER_LENGTH 1024 void main() { int iPort = DEFAULT_PORT; WSADATA wsaData;//协议栈 SOCKET sSocket;//服务端的socket int iLen;//客户端地址长度 int iSend;//发送数据的长度 int iRecv;//接受数据的缓冲区长度 char sendBuf[] = "Hello! I am server";//服务端要发送的字符串 char recvBuf[BUFFER_LENGTH];//服务器端接受数据的缓冲区 struct sockaddr_in ser, cli; //本地地址和客户地址 printf("-----------------\n"); printf("Server waiting\n"); printf("-----------------\n"); //加载协议栈 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock.\n"); return; } //创建服务器端的socket套接口 sSocket = socket(AF_INET, SOCK_DGRAM, 0); if (sSocket == INVALID_SOCKET) { printf("socket(Failed:%d\n)", WSAGetLastError); return; } //初始化服务器端的地址与端口号 ser.sin_family = AF_INET; ser.sin_port = htons(8888);//服务器端监听的端口号 ser.sin_addr.s_addr = htonl(INADDR_ANY);//服务端的端口地址 //将服务器端socket和服务器的端ip地址和端口号绑定, if (bind(sSocket, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR) { printf("bind() Failed:%d\n", WSAGetLastError()); return; } iLen = sizeof(cli); memset(recvBuf, 0, sizeof(recvBuf));//将接收缓冲区内容全部初始化为0 while (1) { //从服务器端套接口中接收数据,并把客户端的地址情况保存到cli上面 iRecv = recvfrom(sSocket, recvBuf, BUFFER_LENGTH, 0,(SOCKADDR*)&cli,&iLen); if (iRecv == SOCKET_ERROR) { printf("recvfrom()Faild;%d\n", WSAGetLastError()); break; } else if (iRecv == 0) { break; } else { printf("recvfrom():%s\n", recvBuf); printf("accepted client ip[%s], port[%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port)); } //向客户端发送数据 iSend = sendto(sSocket, sendBuf, sizeof(sendBuf), 0, (SOCKADDR*)&cli, sizeof(cli)); if (iSend == SOCKET_ERROR) { printf("sendto() Faild:%d\n", WSAGetLastError()); printf("----------\n"); break; } else if (iSend == 0) break; else { printf("sendto() succeeded\n"); printf("-=---------\n"); } } closesocket(sSocket);//关闭套接口 WSACleanup();//清空协议栈 }
client.c
#include<Winsock2.h> #include<stdio.h> #pragma comment(lib,"ws2_32.lib") void main() { WSADATA wsaData;//协议栈 SOCKET sClient;//客户端套接口 struct sockaddr_in ser;//客户端地址 int iPort = 8888; int iLen;//客户端地址长度 int iSend; int iRecv; char sendBuf[1024];//发送数据缓冲区 char recvBuf[1024];//接收数据缓冲区 memset(recvBuf, 0, sizeof(recvBuf));//把接收数据缓冲区初始化为0 //加载协议栈 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock\n"); return; } //初始化客户端地址情况 ser.sin_family = AF_INET; ser.sin_port = htons(8888); ser.sin_addr.s_addr = inet_addr("127.0.0.1"); //创建客户端套接口 sClient = socket(AF_INET, SOCK_DGRAM, 0); if (sClient == INVALID_SOCKET) { printf("socket() Faild %d\n", WSAGetLastError()); return; } iLen = sizeof(ser); while (1) { printf_s("请输入要发送的消息:"); gets_s(sendBuf, 1024); //开始发送数据 iSend = sendto(sClient, sendBuf, sizeof(sendBuf), 0, (struct sockaddr*)&ser, iLen); if (iSend == SOCKET_ERROR) { printf("sendto()faild %d", WSAGetLastError()); return; } else if (iSend = 0) { return; } else { printf("sendto() succeeded\n"); } //接收数据 iRecv = recvfrom(sClient, recvBuf, sizeof(recvBuf), 0, (struct sockaddr*)&ser, &iLen); if (iRecv == SOCKET_ERROR) { printf("recvfrom() faild %d\n", WSAGetLastError()); return; } else if (iRecv == 0) return; else { printf("recvfrom() %s", recvBuf); printf("-----------------\n"); } } closesocket(sClient);//关闭套接口 WSACleanup();//清空协议栈 }
相关文章推荐
- 【tcp-ip学习总结】使用tcp协议实现简单的通信小程序
- 【tcp-ip学习总结】基于udp的多人聊天室,带有登录注册功能
- 程序必备基础知识学习:通信协议——Http、TCP、UDP
- 计算机网络基础-1.TCP、UDP简单通信java实现
- salesforce 零基础学习(四十四)实现checkbox列表简单过滤功能
- TCP-IP学习笔记五:Netty使用--简单通信编程1
- TCP-IP学习笔记六:Netty使用--简单通信编程2
- TCP-IP学习笔记七:Netty使用--简单通信编程3
- UDP和TCP通信机制(实现简单的数据发送与接收)
- Java学习笔记(一)------服务器&客户端一对一通信小程序实现(TCP)
- linux下TCP/IP实现简单聊天程序
- Java 基于TCP/IP 实现简单的 socket 通信
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Linux基于TCP/IP简单的客户端、服务器通信程序实例
- java TCP/IP实现简单的多人聊天功能
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- 使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
- Android编程实现TCP、UDP客户端通信功能示例
- JAVA基础 day25 网络编程 IP类 UDP,TCP传输学习 简易聊天工具 TCP并发学习