基于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
原创粉丝点击