Windows socket 通信

来源:互联网 发布:网络诚信会有什么风险 编辑:程序博客网 时间:2024/06/14 04:48
#include<WINSOCK2.H>#include<stdio.h>#pragma comment(lib,"ws2_32")//#pragma comment( comment-type ,["commentstring"] ) , comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。 , commentstring是一个提供为comment-type提供附加信息的字符串。//静态加入一个lib文件也就是库文件ws2_32.lib文件,提供相关API的支持,否则需要动态载入ws2_32.dll。#define SERVER_PORT 6000#define MAXBUFLEN 1024int main(){WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD(1,1);//返回版本号if(WSAStartup(wVersionRequested,&wsaData)!=0)//启动Windows socket ,0 表示成功{return -1;}if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//LOWORD()得到一个32bit数的低16bit   HIWORD()得到一个32bit数的高16bit   LOBYTE()得到一个16bit数最低(最右边)那个字节   HIBYTE()得到一个16bit数最高(最左边)那个字节{WSACleanup();//  终止Winsock 2 DLL (Ws2_32.dll) 的使用.return -1;}SOCKET sockSrv;if((sockSrv = socket(AF_INET,SOCK_DGRAM,0))==-1)//int socket(int domain, int type, int protocol); 协议族 AF_INET代表ipv4  socket 类型   协议{perror("socket");//将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串WSACleanup();return -1;}SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  //sin_addr是一个联合体,用联合体就可以使用多种方式表示IP地址.一般我们使用其中的最后一种方式,即用无符号长整型数据来表示IP地址.此时,用的是s_nu数据成员,s_un是一个结构体,其中只有一个数据成员,即s_addr.//htonl 本函数将一个32位数从主机字节顺序转换成网络字节顺序。addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(SERVER_PORT);if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==-1) //int PASCAL FAR bind( SOCKET sockaddr, const struct sockaddr FAR* my_addr,int addrlen); 0 成功 -1 失败{perror("bind");return -1;}elseprintf("Server started,listening at port %d\n\n",SERVER_PORT);SOCKADDR_IN addrClient;int len  = sizeof(SOCKADDR);char recvBuf[MAXBUFLEN] = {0};while(1){if(recvfrom(sockSrv,recvBuf,MAXBUFLEN,0,(SOCKADDR*)&addrClient,&len)==-1){perror("recvfrom");break;}printf("Client: %s\n",recvBuf);if(stricmp(recvBuf,"quit")==0)strcpy(recvBuf,"Bye");elsestrcpy(recvBuf,"GET");printf("Server: %s\n",recvBuf);if(sendto(sockSrv,recvBuf,strlen(recvBuf)+1,0,(SOCKADDR*)&addrClient,len)==-1){perror("sendto");break;}if(stricmp(recvBuf,"Bye")==0)break;}closesocket(sockSrv);WSACleanup();return 0;}

0 0