vc++6 怎么编写SOCKET的服务器和客户端 最好都具体步骤

作者&投稿:翁世 (若有异议请与网页底部的电邮联系)
用VC++编写就是设计一个程序,建立一个服务器和两个客户端~

使用服务器、客户模式,有源码,在同一台机器就可以进测试。

孙鑫《VC++深入详解》第14章有该代码的详细解说,可以看看,相信你看了就会明白的

1.简单服务器//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;staticUINTport=%%1;UINTListen(LPVOIDpParam){SOCKETsServer,sClient;charbuf[1024];intretVal;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_INaddrServ;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_inaddrClient;intaddrClientlen=sizeof(addrClient);sClient=accept(sServer,(sockaddrFAR*)&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();return0;}CWinThread*pThread=AfxBeginThread(Listen,&port);2.简单客户端//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;SOCKETsHost;SOCKADDR_INservAddr;charbuf[1024];intretVal;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);intnServAddlen=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//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){return-1;//失败}charszHostname[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));}}elsereturn;CString%%1(szHostaddress);4.端对端通信//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;SOCKETs;charbuf[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_INservAddr;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;//绑定套接字失败}intnServAddrlen=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_INclientAddr;clientAddr.sin_family=AF_INET;clientAddr.sin_addr.s_addr=inet_addr(%%4);clientAddr.sin_port=htons((short)%%5);intnClientlen=sizeof(clientAddr);if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)&clientAddr,nClientlen)==SOCKET_ERROR){closesocket(s);WSACleanup();return-1;//向服务器发送数据失败}closesocket(s);WSACleanup();5.点对点通信//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;SOCKADDR_INaddrServ,addrServ2;SOCKETsServer,sClient,sHost;intretVal;sockaddr_inaddrClient;charbuf[1024];staticUINTport=%%2;BOOLlistenerRun=TRUE;UINTListen(LPVOIDpParam){addrServ.sin_family=AF_INET;addrServ.sin_port=htons((UINT)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;//开始监听失败}intaddrClientlen=sizeof(addrClient);sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addClientlen);if(INVALID_SOCKET==sClient){closesocket(sServer);WSACleanup();return-1;//接收客户端请求失败}while(listenerRun){ZeroMemory(buf,sizeof(buf));retVal=recv(sClient,buf,sizeof(buf));if(SOCKET_ERROR==retVal){closesocket(sServer);closesocket(sClient);WSACleanup();return-1;//接收客户端数据失败}CString%%4(buf);}}if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){return-1;//失败}sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sServer){WSACleanup();return-1;//创建套接字失败}CWinThread*pThread=AfxBeginThread(Listen,&port);sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sHost){WSACleanup();return-1;//创建套接字失败}servAddr2.sin_family=AF_INET;servAddr2.sin_addr.s_addr=inet_addr(%%1);servAddr.sin_port=htons((short)%%3);intnServerAddrlen=sizeof(servAddr2);retVal=connect(sHost,(LPSOCKADDR)&servAddr2,sizeof(servAddr2));if(SOCKET_ERROR==retVal){closesocket(sHost);WSACleanup();return-1;//连接失败}zeroMemory(buf,sizeof(buf));strcpy(buf,%%5);retVal=send(sHost,buf,sizeof(buf),0);if(SOCKET_ERROR==retVal){closesocket(sHost);WSACleanup();return-1;//向发送数据失败}listenerRun=FALSE;DWORDdwExitCode;::GetExitCodeThread(pThread->m_hThread,&dwExitCode);pThread=null;closesocket(sServer);closesocket(sClient);closesocket(sHost);WSACleanup();


盐田区19515343354: 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){...

盐田区19515343354: VC++ socket编程... -
斐承舒林: 这方面的资料初级的很多,而且例子也很多,但是真正深入一点的网上几乎没有,而即使有些开源的程序没有一定的积累很难看的明白.而且大部分是基于linux的C写的.单讲socket发消息其实没什么难度,做个局域网的一会也就做好了,而且网上...

盐田区19515343354: vc++网络通信编程中用什么来存储一个SOCKET
斐承舒林: 可以使用CList模板 1、类型定义typedef CList <SOCKET,SOCKET&> SOCKET_ARRAY这种类型等价一个名称SOCKET_ARRAY 2、定义变量SOCKET_ARRAY m_SocketarrayList; 3、调用CList模板的成员函数例如:m_SocketarrayList.RemoveAll(); //从列表中移走所有元素m_SocketarrayList.AddHead(); //添加一个元素到列表标题关于CList这个类的详细资料,可以参阅MSDN,CObject::CList

盐田区19515343354: VC++socket能实现一问一答吗?可以的话该如何实现呢 -
斐承舒林: 肯定可以,通信都需要采用应答方式,否则没办法知道信息是否正确被传递.至于如何实现了解了socket的使用方法自然就会了.

盐田区19515343354: 用VC++编程实现获取本机IP和计算机名,使用socket.要求源代码和可执行程序. 急!急!急! -
斐承舒林: #include "WinSock2.h"#include using namespace std;//使用Winsock库,如果你使用其他socket库,可以包含进来#pragma comment(lib, "Ws2_32.lib")int main(int argc, char* argv[]){ char *ptrip=NULL; char name[32]=""; WSADATA ...

盐田区19515343354: vc++网络编程中如何应用socket实现跨网段文件传输?
斐承舒林: 不同网段间传送数据不是应用层需要考虑的问题.应当交给网络层解决.也就是看看你的路由设置是否正确.如果你从A机器 PING B机器不通的话,你的程序也是没办法传送数据的.

盐田区19515343354: VC++ 创建一个单文档工程并且编了好多内容,但是现在往里面添加套接字Socket编程,有方法解决吗 -
斐承舒林: 1. 加Socket是可以,将相应的头文件加进去,初始化一下Socket2. 单文档程序中加对话框也是可以的,在资源视图下创建对话框,使用DoModel或者CreateDialog方法显示.另外也可以考虑分隔窗口的方法,在分隔窗口中显示对话框.

盐田区19515343354: VC++网络编程,怎么处理socket接收到的数据 -
斐承舒林: VC++ 用Socket持续接收数据的程序举例如下:while(1) { //client receiving code if ((numbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) perror("recv"); } buf[numbytes] = '\0';printf("numbytes is %d\n", numbytes);printf("client: received '%...

盐田区19515343354: visual c++6 如何使用socket传送实时图象数据
斐承舒林: 传送实时数据,在建立CSocket对象时最好选择UDP方式.假如你传送的是文件数据,那么将文件用CFile读入内存,不停Send,每次传送若干字节就是了.最好用RTCP,RTP协议来做这种事情.请参考:www.live555.com,那儿有开源代码.

盐田区19515343354: vc++ 多线程编程 SOCKET通信 -
斐承舒林: 你给客户端发送数据是用send么 如果没Sleep的话,你创建了一个新线程,创建新线程的同时,当前线程也在运行,socket都被你关掉了,还怎么send?? 线程跟函数是不同的,函数是等调用结束后才执行下一个语句

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网