基于TCP和UDP网络应用程序的编写
来源:互联网 发布:云计算定岗培训生骗局 编辑:程序博客网 时间:2024/05/22 03:16
1、TCP
服务器端:
#include <Winsock2.h>#include <stdio.h>int main(){//wVersionRequested保存WinSock库的版本号 WORD wVersionRequested;WSADATA wsaData;int err;//用MAKEWORD宏创建一个包含了请求版本号的WORD值wVersionRequested = MAKEWORD(1,1);//调用WSAStartup加载套接字库err = WSAStartup(wVersionRequested,&wsaData);if (err != 0){return ;}//判断是否我们请求的版本号if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();return ;}//创建用于监听的套接字//第三个参数为0,这样函数将根据地址格式和套接字类别自动选择一个合适的协议SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);//绑定套接字bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));//将套接字设为监听模式,准备接收客户请求//设置等待连接队列的最大长度为6listen(sockSrv,6);//接收客户端的地址信息SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);while(1){//等待客户请求到来,建立连接之后,同时它将返回一个相对于当前这个新连接的一个套接字描述符,//保存在sockConn中,然后利用这个套接字可以与客户端进行通信,而我们先前的套接字继续监听客户端的连接请求。SOCKET sockConn = accept(sockSrv,(SOCKADDR *)&addrClient,&len);char sendBuf[100];sprintf(sendBuf,"Welcome %s to http://blog.csdn.net/sharing_li",inet_ntoa(addrClient.sin_addr));//发送数据send(sockConn,sendBuf,strlen(sendBuf) + 1,0);char recvBuf[100];//接收数据recv(sockConn,recvBuf,100,0);//打印接收的数据printf("%s\n",recvBuf);//关闭套接字closesocket(sockConn);}return 0;}客户端:
#include<Winsock2.h>#include<stdio.h>int main(){//加载套接字库WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1,1);err = WSAStartup(wVersionRequested,&wsaData);if (err != 0){return ;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();return ;}//创建套接字SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;//因为本例是服务端和客户端都是本地的,所以使用一个特殊的IP地址,本地回路地址,127.0.0.1addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);//向服务器发出连接请求,对于客户端来说,它不需要绑定,可以直接连接服务器connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));//接收数据char recvBuf[100];recv(sockClient,recvBuf,100,0);printf("%s\n",recvBuf);//发送数据send(sockClient,"This is Sharing",strlen("This is Sharing") + 1,0);//关闭套接字closesocket(sockClient);WSACleanup();return 0;}
2、UDP
服务器端:
#include<Winsock2.h>#include<stdio.h>int main(){//加载套接字库WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1,1);err = WSAStartup(wVersionRequested,&wsaData);if (err != 0){return ;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();return ;}//创建套接字SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);//绑定套接字bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));//等待并接收数据SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);char recvBuf[100];recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR *)&addrClient,&len);printf("%s\n",recvBuf);//关闭套接字closesocket(sockSrv);WSACleanup();return 0;}
客户端:
#include<Winsock2.h>#include<stdio.h>int main(){//加载套接字库WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1,1);err = WSAStartup(wVersionRequested,&wsaData);if (err != 0){return ;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();return ;}//创建套接字SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl("127.0.0.1");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);//发送数据sendto(sockClient,"Hello",strlen("Hello") + 1,0,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));//关闭套接字closesocket(sockClient);WSACleanup();return 0;}
PS:注意基于TCP和UDP的网络应用程序在接收和发送数据使用的函数不一样,前者是recv和send,后者使用recvfrom和sendto。
0 0
- 基于TCP和UDP网络应用程序的编写
- C++基于UDP的网络应用程序的编写
- C++基于TCP的网络应用程序的编写
- JAVA基于TCP和UDP的网络连接
- 基于TCP的网络应用程序
- 基于C的UDP,TCP网络编程
- 基于TCP/UDP的网络聊天程序
- 基于TCP,UDP的网络编程总结
- [转]编写基于TCP的应用程序
- TCP 的 网络应用程序的编写
- winsock网络编程——基于TCP的程序设计和基于UDP的程序设计
- Windows实现基于TCP的网络应用程序
- C语言编写基于TCP和UDP协议的Socket通信程序示例
- 基于socket的TCP和UDP编程
- 基于socket的TCP和UDP编程
- 基于socket的TCP和UDP编程
- 基于Socket的TCP和UDP编程
- 基于Socket的UDP和TCP编程
- 设计模式大集锦 程序员面试全攻略
- 将VirtualBox(vdi)的虚拟硬盘格式转换为VMWare (vmdk) 格式
- 【Twitter Storm系列】flume-ng+Kafka+Storm+HDFS 实时系统搭建
- 类加载器
- 使用sdk19编译带SlidingMenu库的项目
- 基于TCP和UDP网络应用程序的编写
- IOS 点击空白处隐藏键盘的几种方法
- 页面处理技术
- POJ-1236-Network of Schools
- 解决Spring @ResponseBody注解返回字符串IE提示下载
- IDL divide by zero
- Xamarin: Moving the view on Keyboard show 弹出键盘时移动view高度
- 浅析线程的基本使用(3)
- 逆序法