vc++6 怎么编写SOCKET的服务器和客户端 最好都具体步骤
1.简单服务器 //#include //#pragma comment(lib,"WS2_32.lib") WSADATA wsd; static UINT port=%%1; UINT Listen(LPVOID pParam) { SOCKET sServer,sClient; char buf[1024]; int retVal; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { return -1;//失败 } sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET==sServer) { WSACleanup(); return -1;//创建套接字失败 } SOCKADDR_IN addrServ; addrServ.sin_family=AF_INET; addrServ.sin_port=htons((short)pParam); addrServ.sin_addr.s_addr=INADDR_ANY; retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN)); if(SOCKET_ERROR==retVal) { closesocket(sServer); WSACleanup(); return -1;//绑定套接字失败 } retVal=listen(sServer,1); if(SOCKET_ERROR==retVal) { closesocket(sServer); WSACleanup(); return -1;//开始监听失败 } sockaddr_in addrClient; int addrClientlen=sizeof(addrClient); sClient=accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen); if(INVALID_SOCKET==sClient) { closesocket(sServer); WSACleanup(); return -1;//开始接受客户端连接失败 } ZeroMemory(buf,sizeof(buf)); retVal=recv(sClient,buf,sizeof(buf),0); if(SOCKET_ERROR==retVal) { closesocket(sServer); closesocket(sClient); WSACleanup(); return -1;//接收数据失败 } CString %%2(buf); closesocket(sServer); closesocket(sClient); WSACleanup(); return 0; } CWinThread *pThread=AfxBeginThread(Listen,&port); 2.简单客户端 //#include //#pragma comment(lib,"WS2_32.lib") WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; char buf[1024]; int retVal; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { return -1;//失败 } sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET==sHost) { WSACleanup(); return -1;//创建套接字失败 } servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=inet_addr(%%3); servAddr.sin_port=htons((short)%%2); int nServAddlen=sizeof(servAddr); retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr)); if(SOCKET_ERROR==retVal) { closesocket(sHost); WSACleanup(); return -1;//连接服务器失败 } ZeroMemory(buf,sizeof(buf)); strcpy(buf,%%3); retVal=send(sHost,buf,sizeof(buf),0); if(SOCKET_ERROR==retVal) { closesocket(sHost); WSACleanup(); return -1;//向服务器发送数据失败 } closesocket(sHost); WSACleanup(); 3.获得本机IP //#include //#pragma comment(lib,"WS2_32.lib") WSADATA wsd; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { return -1;//失败 } char szHostname[100],szHostaddress[200]; if(gethostname(szHostname,sizeof(szHostname))!=SOCKET_ERROR) { HOSTENT *pHostEnt=gethostbyname(szHostname); if(pHostEnt!=NULL){ sprintf(szHostaddress,"%d.%d.%d.%d", ( pHostEnt->h_addr_list[0][0]&0x00ff ), ( pHostEnt->h_addr_list[0][1]&0x00ff ), ( pHostEnt->h_addr_list[0][2]&0x00ff ), ( pHostEnt->h_addr_list[0][3]&0x00ff )); } } else return; CString %%1(szHostaddress); 4.端对端通信 //#include //#pragma comment(lib,"WS2_32.lib") WSADATA wsd; SOCKET s; char buf[1024]; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { return -1;//失败 } s=socket(AF_INET,SOCK_DGRAM,0); if(s==INVALID_SOCKET) { WSACleanup(); return -1;//创建套接字失败 } SOCKADDR_IN servAddr; servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=inet_addr(%%1); servAddr.sin_port=htons(INADDR_ANY); if(bind(s,(SOCKADDR*)&servAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR) { closesocket(s); WSACleanup(); return -1;//绑定套接字失败 } int nServAddrlen=sizeof(servAddr); ZeroMemory(buf,sizeof(buf)); if(recvfrom(s,buf,sizeof(buf),0,(SOCKADDR*)&servAddr,&nServAddrlen)==SOCKET_ERROR) { closesocket(s); WSACleanup(); return -1;//接收数据失败 } CString %%2(buf); ZeroMemory(buf,sizeof(buf)); strcpy(buf,%%3); SOCKADDR_IN clientAddr; clientAddr.sin_family=AF_INET; clientAddr.sin_addr.s_addr=inet_addr(%%4); clientAddr.sin_port=htons((short)%%5); int nClientlen=sizeof(clientAddr); if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)&clientAddr,nClientlen)==SOCKET_ERROR) { closesocket(s); WSACleanup(); return -1;//向服务器发送数据失败 } closesocket(s); WSACleanup(); 5.点对点通信 //#include //#pragma comment(lib,"WS2_32.lib") WSADATA wsd; SOCKADDR_IN addrServ,addrServ2; SOCKET sServer,sClient,sHost; int retVal; sockaddr_in addrClient; char buf[1024]; static UINT port=%%2; BOOL listenerRun=TRUE; UINT Listen(LPVOID pParam) { addrServ.sin_family=AF_INET; addrServ.sin_port=htons((UINT)...
求一个C++多线程通信的例子
关于winsock服务器和客户端编程2008年12月28日 星期日 23:22在网络编程中,最常用和最基础的就是WINSOCK. 现在我们讨论WINDOWS下的SOCKET编程. 大凡在WIN32平台上的WINSOCK编程都要经过下列步骤: 定义变量->获得WINDOCK版本->加载WINSOCK库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载WINSOCK库->释放资源 下面介绍WINSOCK C/S的建立过程: 服务器 客户端 ________________________________________________ 1 初始化WSA 1 初始化WSA ____________________________________________________ 2 建立一个SOCKET 2 建立一个SOCKET _____________________________________________________ 3 绑定SOCKET 3 连接到服务器 _____________________________________________________ 4 在指定的端口监听 4 发送和接受数据 _____________________________________________________ 5 接受一个连接 5 断开连接 ______________________________________________________- 6 发送和接受数据 ___________________________________________________ 7 断开连接 __________________________________________________ 大家注意,在VC中进行WINSOCK编程时,需要引入如下两个库文件:WINSOCK.H(这个是WINSOCK API的头文件,WIN2K以上支持WINSOCK2,所以 可以用WINSOCK2.H);Ws2_32.lib(WINSOCK API连接库文件). 使用方式如下: #include #pragma comment(lib,"ws2_32.lib") 下面我们通过具体的代码演示服务器和客户端的工作流程: 首先,建立一个WSADATA结构,通常用wsaData WSADATA wsaData; 然后,调用WSAStartup函数,这个函数是连接应用程序与winsock.dll的第一个调用.其中,第一个参数是WINSOCK 版本号,第二个参数是指向 WSADATA的指针.该函数返回一个INT型值,通过检查这个值来确定初始化是否成功.调用格式如下:WSAStartup(MAKEWORD(2,2),&wsaData),其中 MAKEWORD(2,2)表示使用WINSOCK2版本.wsaData用来存储系统传回的关于WINSOCK的资料. if(iResuit=WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("WSAStartup failed:%d",GetLastError()); //返回值不等与0,说明初始化失败 ExitProcess(); //退出程序 } 应用程序在完成对请求的SOCKET库使用后,要调用WSACleanup函数来接触SOCKET库的绑定,并且释放资源. 注意WSAStartup初始化后,必须建立一个SOCKET结构来保存SOCKET句柄. 下面我们建立一个SOCKET. 首先我们建立一个m_socket的SOCKET句柄,接着调用socket()函数,函数返回值保存在m_socket中.我们使用AF_INFE,SOCK_STREAM,IPPROTO_TCP 三个参数.第一个表示地址族,AF_INFE表示TCP/IP族,第二个表示服务类型,在WINSOCK2中,SOCKET支持以下三种类型; SOCK_STREAM 流式套接字 SOCK_DGRAM 数据报套接字 SOCK_RAW 原始套接字 第三个参数表示协议: IPPROTO_UDP UDP协议 用于无连接数据报套接字 IPPROTO_TCP TCP协议 用于流式套接字 IPPROTO_ICMP ICMP协议用于原始套接字 m_socket=socket(AF_INFE,SOCK_STREAM,IPPROTO_TCP); //创建TCP协议 以下代码用于检查返回值是否有错误: if(m_scoket==INVALID_SOCKET) { prinrf("Error at socket():%d\n",GetLastError()); WSACleanup(); //释放资源 return; } 说明,如果socket()调用失败,他将返回INVALID_SOCKET. 为了服务器能接受一个连接,他必须绑定一个网络地址,下面的代码展示如何绑定一个已经初始化的IP和端口的Socket.客户端程序用这个 IP地址和端口来连接服务器. sockaddr_in service; service.sin_family=AF_INET; //INTERNET地址族 service.sin_addr.s_addr=inet_addr("127.0.0.1"); //将要绑定的本地IP地址 service.sin_port=htons(27015); //27015将要绑定的端口 下面我们调用BIND函数,把SOCKET和SOCKADDR以参数的形式传入,并检查错误. if(bind(m_socket,(SOCKADDR*)&SERVICE,sizeof(service))==SOCKET_ERROR) { printf("bind() failed.\n"); closesocket(m_socket); return; } 当绑定完成后,服务器必须建立一个监听队列,以接受客户端的请求.listen()使服务器进入监听状态,该函数调用成功返回0,否则返回 SOCKET_ERROR.代码如下: if(listen(m_socket,1)==SOCKET-ERROR) { printf("error listening on socket.\n"); } 服务器端调用完LISTEN()后,如果此时客户端调用CONNECT()函数,服务器端必须在调用ACCEPT().这样服务器和客户端才算正式完成通信程序的 连接动作. 一旦服务器开始监听,我们就要指定一个句柄来表示利用ACCEPT()函数接受的连接,这个句柄是用来发送和接受数据的表示.建立一个SOCKET句柄 Socket AcceptSocket 然后利用无限循环来检测是否有连接传入.一但有连接请求,ACCEPT()函数就会被调用,并且返回这次连接的句柄. printf("waitong for a client to connect...\n")...
SOCKET编程里send 和Receive函数的使用
这可是我自己总结的,LZ不要误会哦~~!1.简单服务器 //#include //#pragma comment(lib,"WS2_32.lib") WSADATA sServer,sClient; chat buf[1024]; int retVal; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { return -1;//失败 } sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET==sServer) { WSACleanup(); return -1;//创建套接字失败 } SOCKADDR_IN addrServ; addrServ.sin_family=AF_INET; addrServ.sin_port=htons(%%1); addrServ.sin_addr.s_addr=INADDR_ANY; retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN)); if(SOCKET_ERROR==retVal) { closesocket(sServer); WSACleanup(); return -1;//绑定套接字失败 } retVal=listen(sServer,1); if(SOCKET_ERROR==retVal) { closesocket(sServer); WSACleanup(); return -1;//开始监听失败 } socketaddr_in addrClient; int addrClientlen=sizeof(addrClient); sClient=accept(sServer(sockaddr FAR*)&addrClient,&addClientlen); if(INVALID_SOCKET==sClient) { closesocket(sServer); WSACleanup(); return -1;//开始接受客户端连接失败 } ZeroMemory(buf,sizeof(buf)); retVal=recv(sClient,buf,sizeof(buf)); if(SOCKET_ERROR==retVal) { closesocket(sServer); closesocket(sClient); WSACleanup(); return -1;//接收数据失败 } CString %%2(buf); closesocket(sServer); closesocket(sClient); WSACleanup(); 2.简单客户端 //#include //#pragma comment(lib,"WS2_32.lib") WSADATA sHost; SOCKADDR_IN addrServ; chat buf[1024]; int retVal; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { return -1;//失败 } sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET==sHost) { WSACleanup(); return -1;//创建套接字失败 } servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=inet_addr(%%1); servAddr.sin_port=htons((short)%%2); int nServAddlen=size(servAddr); retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr)); if(sOCKET_ERROR==retVal) closesocket(sHost); WSACleanup(); return -1;//连接服务器失败 } ZeroMemory(buf,sizeof(buf)); strcpy(buf,%%3); retVal=send(sHost,buf,sizeof(buf),0); if(SOCKET_ERROR==retVal) { closesocket(sHost); WSACleanup(); return -1;//向服务器发送数据失败 } closesocket(sHost); WSACleanup(); 3.获得本机IP //#include //#pragma comment(lib,"WS2_32.lib") /* if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { return -1;//失败 } */ //#pragma comment(lib,"WS2_32.lib") char szHostname[100],szHostaddress[200]; if(gethostname(szHostname,info(szHostname))!=SOCKET_ERROR) { HOSTENT *pHostEnt=gethostbyname(szHostname); if(pHostEnt!=NULL){ sprintf(szHostaddress,"%d.%d.%d.%d", ( pHostEnt->h_addr_list[0][0]&0x00ff ), ( pHostEnt->h_addr_list[0][1]&0x00ff ), ( pHostEnt->h_addr_list[0][2]&0x00ff ), ( pHostEnt->h_addr_list[0][3]&0x00ff )); } } else return; CString %%1(szHostaddress); 展开
make word cards造句
Take out your word card , please .拿出单词卡片。
The teacher flashed up each word card to see if the children would recognize it.老师举起一张张单词卡片,看学生是否可以辨识。
Mother put some "cat" word card posted in the house, and then take a everywhere "cat" word card, please help it find baby friend (let the baby took off in the word CARDS everywhere stick).妈妈把一些“小花猫”字卡贴在屋内各处,然后再拿一张“小花猫”字卡,请宝宝帮它找朋友(让宝宝摘下贴在各处的字卡)。
Please buy the disk and word card from the book store.请还没有购买光碟和卡片的家长尽快购买。
Each teacher throws the dice in turn. You can take a piece of English word card of 4 or 6 level according to you ability if you throw the dice with 2 or 4 or 6.每位教师轮流掷,掷到2 4 6 可以根据自己的情况从四级或六级单词卡片的箱子里抽取一张卡片并且大声读出来。
T say the story and get Ss show the word card when they hear it.故事是学生喜闻乐见的,听一听出示单词,训练并检查了学生的听力。
Review the sounds Teacher makes a sound of a letter and shows a word card. If the word including the sound, students clap and read the word. Or not students just stomp.通过拍手、跺脚的身体运动,来复习字母和其发音,既测试学生反应速度,又从一开始就调动学生的积极性。
Clothing brand has become one occupational characteristics, quality of life, a status symbol, as the modern "free word business card."服装的品牌已然成为人们职业特点、生活品位、身份地位的象征,成为现代人的“无字名片”。
Put one English word on each card, and then put either the translation or the English definition on the back.After you study the words, review them quickly to see how many words you remember.在每个卡片上写下一个单词,背面写上中文或者英文注释。
学习了单词后,快速复习一遍来检查你记住了多少个?
...(make)wordcards.2.Does
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
【服务器端】#include "stdafx.h"#include #include #include #define SERVER_PORT 5208 //侦听端口void main(){ WORD wVersionRequested; WSADATA wsaData; int ret, nLeft, length; SOCKET sListen, sServer; //侦听套接字,连接套接字 struct sockaddr_in saServer, saClient; //地址信息 char *ptr;//用于遍历信息的指针 //WinSock初始化 wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本 ret=WSAStartup(wVersionRequested, &wsaData); if(ret!=0) { printf("WSAStartup() failed!\n"); return; } //创建Socket,使用TCP协议 sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sListen == INVALID_SOCKET) { WSACleanup(); printf("socket() faild!\n"); return; } //构建本地地址信息 saServer.sin_family = AF_INET; //地址家族 saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序 saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址 //绑定 ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer)); if (ret == SOCKET_ERROR) { printf("bind() faild! code:%d\n", WSAGetLastError()); closesocket(sListen); //关闭套接字 WSACleanup(); return; } //侦听连接请求 ret = listen(sListen, 5); if (ret == SOCKET_ERROR) { printf("listen() faild! code:%d\n", WSAGetLastError()); closesocket(sListen); //关闭套接字 return; } printf("Waiting for client connecting!\n"); printf("Tips: Ctrl+c to quit!\n"); //阻塞等待接受客户端连接 while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
{ length = sizeof(saClient); sServer = accept(sListen, (struct sockaddr *)&saClient, &length); if (sServer == INVALID_SOCKET) { printf("accept() faild! code:%d\n", WSAGetLastError()); closesocket(sListen); //关闭套接字 WSACleanup(); return; } char receiveMessage[5000]; nLeft = sizeof(receiveMessage); ptr = (char *)&receiveMessage; while(nLeft>0) { //接收数据 ret = recv(sServer, ptr, 5000, 0); if (ret == SOCKET_ERROR) { printf("recv() failed!\n"); return; } if (ret == 0) //客户端已经关闭连接 { printf("Client has closed the connection\n"); break; } nLeft -= ret; ptr += ret; } printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。
} // closesocket(sListen); // closesocket(sServer); // WSACleanup();}【客户端】#include "stdafx.h"#include #include #include #define SERVER_PORT 5208 //侦听端口void main(){ WORD wVersionRequested; WSADATA wsaData; int ret; SOCKET sClient; //连接套接字 struct sockaddr_in saServer; //地址信息 char *ptr; BOOL fSuccess = TRUE; //WinSock初始化 wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本 ret = WSAStartup(wVersionRequested, &wsaData); if(ret!=0) { printf("WSAStartup() failed!\n"); return; } //确认WinSock DLL支持版本2.2 if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2) { WSACleanup(); printf("Invalid WinSock version!\n"); return; } //创建Socket,使用TCP协议 sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sClient == INVALID_SOCKET) { WSACleanup(); printf("socket() failed!\n"); return; } //构建服务器地址信息 saServer.sin_family = AF_INET; //地址家族 saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序 saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127"); //连接服务器 ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer)); if (ret == SOCKET_ERROR) { printf("connect() failed!\n"); closesocket(sClient); //关闭套接字 WSACleanup(); return; } char sendMessage[]="hello this is client message!"; ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0); if (ret == SOCKET_ERROR) { printf("send() failed!\n"); } else printf("client info has been sent!"); closesocket(sClient); //关闭套接字 WSACleanup();}
怎么用C++实现点对点通信
1、使用c++TCP /IP 编程 ,socket 或者 RemoteFuncationsCall 远程方法调用 (RPC)。
2、服务器端:#include #include #pragma comment(lib,"WS2_32.lib") void main() { WSADATA wsd; SOCKET server; //服务器socket SOCKADDR_IN addrSrv; char sendBuf[100]; char recvBuf[100]; SOCKADDR_IN addrClient; SOCKET client; //连接的客户端socket int len; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { printf("启动失败!\n"); return ; } server=socket(AF_INET,SOCK_STREAM,0); //创建socket addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //设置地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); //设置端口号 bind(server,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定 listen(server,5); //设置最多连接数 len=sizeof(SOCKADDR); while(1) { client=accept(server,(SOCKADDR*)&addrClient,&len); //接收客户端连接 sprintf(sendBuf,"Welcome %s ", inet_ntoa(addrClient.sin_addr)); send(client,sendBuf,strlen(sendBuf)+1,0); //发送信息客户端 recv(client,recvBuf,100,0); //接收客户端数据 printf("%s\n",recvBuf); closesocket(client); } closesocket(client); //关闭连接 WSACleanup(); }3、客户端:#include #include #pragma comment(lib,"WS2_32.lib") void main() { WSADATA wsd; SOCKET sockClient; //客户端socket SOCKADDR_IN addrSrv; char recvBuf[100]; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { printf("start up failed!\n"); return ; } sockClient=socket(AF_INET,SOCK_STREAM,0); //创建socket addrSrv.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)); //连接服务器端 recv(sockClient,recvBuf,100,0); //接收服务器端数据 printf("%s\n",recvBuf); send(sockClient,"hello world",strlen("hello world")+1,0); //向服务器端发送数据 closesocket(sockClient); //关闭连接 WSACleanup(); }
C++,为什么客户端连不到服务器端。
代码如下:
"|" 是按位或运算符,对整型数进行二进制按位取或运算。
比如0110 0011| 0011 0101--------------------= 0111 0111定义MakeWord(a, b) 的含义应该是将a b合成一个字(双字节),比如 MakeWord(0xaa, 0xbb) 结果应该是0xbbaa,a在低字节,转换成BYTE只留下一字节的内容,b也留下一字节并左移做高字节,通过按位或运算符将两者合并到一起。
转载请注明出处51数据库 » makeword 2 2