手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

Windows下的UDP Socket编程

时间:2024-10-24 23:30:21

1、首先在电脑上安装好VC++6.0。这个网上已经有很多教程了,本文就不多做介绍了。

2、了解一下网络知识,TCP,UDP以及SOCKET是什么。其实socket就是一个五元组,网络协议,本地端口,本地IP,远地端口,远地IP。socket编程主要是把数据发送到一个本地的缓冲区,而从本地传输到远地的计算机这个过程则无需我们管。

3、接着,你要了解一下socket函数库里的一些函数和结构体。随便找一本网络编程的书,里面基本都有关于socket库的介绍,描述。下面举几个本文编程会用到的int sendto ( socket s , const void * msg, int len, unsigned int flags, conststruct sockaddr * to , int tolen ) ; //发送int recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen); //接收SOCKET socket( int af, int type, int protocol); //初始化SOCKETclosesocket(); //关闭SOCKET

4、最后贴出程序,其实程序很简单,懂了噩荜务圃网络协议,以及SOCKET,基本都能看懂这个程序,如果有哪些函数不钕瞠林匀懂,可以百度一下。client.cpp#include <WINSOCK2.H> #include <iostream> #include <string> using namespace std; #pragma comment(lib, "ws2_32.lib ") bool Socketbind(SOCKET& socket,short port ,const char* Ip); int main() { WORD wVersionRequested; WSADATA wData; // 这结构是用于接收Wjndows Socket的结构信息的 int err; int port,Otherport; char IPaddr[18]; char OtherIP[18]; wVersionRequested = MAKEWORD( 1, 1 ); // 请求WinSock库 err = WSAStartup( wVersionRequested, &wData ); if ( err != 0 ) { return -1; // 返回值为零时表示成功WSAStartup } SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0); if(sockCli<0) { printf("failed"); return 0; } printf("NEWSocket success.\n"); printf("请输入本机IP地址:\n");gets(IPaddr); printf("请输入本机端口号:\n");scanf("%d",&port); if(! BindSocket(sockCli,port,IPaddr) ) { printf("failed"); return 0; } printf("BindSocket success.\n"); SOCKADDR_IN address; printf("请输入远机IP地址:\n"); scanf("%s",OtherIP); printf("请输入远机端口号:\n"); scanf("%d",&Otherport); address.sin_family=AF_INET; address.sin_addr.s_addr=inet_addr(OtherIP); address.sin_port=htons(Otherport); char talk[100]={0}; gets(talk); SOCKADDR_IN addre; int n=sizeof(struct sockaddr); char buffer[100] = "ghfd"; while(talk[0]!='f') { printf("please talk:\n"); gets(talk); if( sendto(sockCli,talk, sizeof(talk), 0,(const struct sockaddr*)&address,sizeof(struct sockaddr) ) ==SOCKET_ERROR ) printf("发送失败\n"); recvfrom(sockCli,buffer,100,0,(struct sockaddr*)&addre,&n); puts(buffer); } closesocket(sockCli); WSACleanup();} bool Socketbind(SOCKET& socket,short port ,const char* Ip) { SOCKADDR_IN address; address.sin_family=AF_INET; address.sin_addr.s_addr =inet_addr(Ip); address.sin_port=htons(port); if(SOCKET_ERROR == bind(socket,(const struct sockaddr*)&address,sizeof(struct sockaddr)) ) { return false; } return true; }

5、server.cpp#include &盟敢势袂lt;WINSOCK2.H> #include <string> using namespace std; #pragma comment(lib, "ws2_32.lib ") bool BindSocket(SOCKET& socket,short port ,const char* sIp); int main() { WORD wVersionRequested; WSADATA wData; // 这结构是用于接收Wjndows Socket的结构信息的 int err; int port; char IPaddr[18]; SOCKADDR_IN address; int n=sizeof(struct sockaddr); char talk[100]={0}; char buffer[100] = {0}; wVersionRequested = MAKEWORD( 1, 1 ); // 请求WinSock库 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return -1; // 返回值为零时表示成功WSAStartup } SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0); if(sockSrv<0) { printf("failed"); return 0; } printf("NEWSocket success.\n"); printf("请输入本机IP地址:\n"); gets(IPaddr); printf("请输入本机端口号:\n"); scanf("%d",&port); gets(buffer); //去掉回车 while(! BindSocket(sockSrv,port,IPaddr) ) { printf("failed"); printf("请输入本机端口号:\n"); scanf("%d",&port); } printf("BindSocket success.\n"); while(buffer[0]!='f') { if(recvfrom(sockSrv,buffer, 100,0,(struct sockaddr*)&address,&n) ==SOCKET_ERROR ) printf("接收失败\n"); else { puts(buffer); printf("please talk:\n"); gets(talk); sendto(sockSrv,talk, sizeof(talk), 0,(const struct sockaddr*)&address,sizeof(struct sockaddr) ); } } closesocket(sockSrv); WSACleanup();} bool Socketbind(SOCKET& socket,short port ,const char* Ip) { SOCKADDR_IN address; address.sin_family=AF_INET; address.sin_addr.s_addr =inet_addr(Ip); address.sin_port=htons(port); memset(address.sin_zero,0,sizeof(address.sin_zero)); if(SOCKET_ERROR == bind(socket,(const struct sockaddr*)&address,sizeof(struct sockaddr)) ) { return false; } return true; }

© 手抄报圈