|
![]() | 作者: zxf821111 [zxf821111]
![]() |
登录 |
SERVER.CPP: 本程序为服务器端程序,通信任一方只要发送 bye 通信过程就自动结束。在面向连接通信过程中服务器先与端口3000绑定,然后等待客户连接。连接成功后就可收发信息。#include <condefs.h> #pragma hdrstop //------------------------------------------------------- #include <conio.h> #include <stdio.h> //#include <winsock2.h> #include <afxsock> //------------------------------------------------------- #pragma argsused bool InitSocket(); int main(int , char**) { struct sockaddr addr; int len,off; bool over; char msg[255]; SOCKET sock ,sersock; if( !InitSocket() ) return 0; //初始化Window Sockets DLL //创建流Socket:即传输层使用TCP sock = socket( AF_INET,SOCK_STREAM,0 ); if( sock==INVALID_SOCKET ){ //不能创建,返回 printf("不能创建Socket!"); getch(); WSACleanup( ); return 0; } //设置IP地址和端口号 ((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议 ((sockaddr_in*)&addr)->sin_port = htons(3000); //服务器端口号3000 ((sockaddr_in*)&addr)->sin_addr.s_addr = inet_addr("202.195.143.10");//主机地址 //把套接字与地址绑定 bind(sock,&addr,sizeof(addr)); //监听网络连接 listen(sock,1); //监听连接:1--允许等待队列的长度 printf("等待客户连接!\n"); len = sizeof(addr); //接受网络连接,生成新的套接字sersock标识这一连接 sersock = accept( sock,&addr,&len );//从等待队列中检取客户,如队列空则进程挂起 //如不空,则接受并生成新Socket以表示此连接,而原Socket继续等待新客户 if(sersock==INVALID_SOCKET){ DWORD err = WSAGetLastError(); char txt[100]; sprintf(txt,"error when accept!---errno:%d",err); printf(txt); getch(); WSACleanup( ); return 0; } printf("有客户连接!\n输入bye通信结束\n"); over = false; do{ printf("\n等待用户输入信息......"); len = recv ( sersock,msg,200,0 ); //接收用户信息 printf("收到信息:%s",msg); if( strcmp(msg,"bye")==0 ){ //若收到bye就结束通信 printf(msg);break; } printf("输入信息:");gets(msg); if( strcmp(msg,"bye")==0 ) over = true; //若发出bye就结束通信 send ( sersock,msg,strlen(msg)+1,0 ); //发出输入信息 }while( !over ); //关闭套接字 closesocket(sersock); closesocket(sock); printf("按任一键返回"); getch(); close WSACleanup( ); return 0; } bool InitSocket() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); //初始化Windows Sockets DLL, err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { printf("没有Windows Socket动态库!\n"); getch(); return false; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) { printf("需要Windows Socket 2!\n"); getch(); WSACleanup( ); return false; } return true; } 本程序为客户端程序。通信的任一方只要发送 bye 通信过程就自动结束,在面向连接的通信过程中,服务器首先启动,客户端启动后,先输入服务器的 IP 地址和端口号3000,再与服务器端连接,连接成功后就可收发信息。 #include <condefs.h> #pragma hdrstop //------------------------------------------------------------------------ #include <conio.h> #include <stdio.h> #include <string.h> #include <winsock2.h> //Windows Sockets 函数定义 #include <stdlib.h> //--------------------------------------------------------------------- #pragma argsused bool InitSocket(); //初始化Windows Sockets动态连接 int main(int , char**) { int type; SOCKET sock; //套接字 struct sockaddr addr; //地址 int len,portno; int err; char msg[255]; bool over; int i; if( !InitSocket() ) return 0; //初始化Window Sockets DLL type = SOCK_STREAM; //面向连接 sock = socket( AF_INET,type,0 ); //创建支持Internet协议的流式 Socket if( sock==INVALID_SOCKET ){ //不能创建,返回 printf("不能创建Socket!"); getch(); WSACleanup( ); return 0; } //客户端地址设定 ((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议 ((sockaddr_in*)&addr)->sin_port = 0; //客户端端口号:0--系统分配 ((sockaddr_in*)&addr)->sin_addr.s_addr = 0; //主机地址:0--本机 bind(sock,&addr,sizeof(addr)); //输入服务器地址 ((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用 Internet 协议 printf("输入服务器地址(0.0.0.0):"); gets(msg); if(msg[0]=='\0') sprintf(msg,“0.0.0.0”); //如果直接回车,就采用默认设置 (0.0.0.0):本机 ((sockaddr_in*)&addr)->sin_addr.s_addr = inet_addr(msg); //服务 器地址 printf("输入服务器端口号(3000):"); gets(msg); if(msg[0]==‘\0’) portno=3000; //如果直接回车,就采用默认端口 号3000 else portno=atoi(msg); ((sockaddr_in*)&addr)->sin_port = htons( portno ); //服务器端口号; //htons():把主机表示的短整数转化成网络字节顺序 len = sizeof(addr); printf("与服务器连接...!"); err = connect( sock,(sockaddr*)&addr,len ); //在使用面向连接协议时(TCP),必须与服务器连接成功后,才可通信 //在无连接协议(UDP)中,可以直接向对方发数据,而无需连接 if( err==SOCKET_ERROR ){ printf("连接失败!"); getch(); WSACleanup( ); return 0; } printf("成功连接到服务器!\n输入bye通信结束\n"); over = false; do{ printf("\n输入信息:"); gets(msg); if( strcmp(msg,“bye”)==0 ) over = true; //输入“bye”则结束 通信 send ( sock,msg,strlen(msg)+1,0 ); //发送输入信息 if(over) break; printf("\n等待服务器响应......"); len = recv ( sock,msg,200,0 ); msg[len]=0; //接受信息 if( strcmp(msg,“bye”)==0 ) over = true; //收到“bye”则结束通信 printf("收到信息:"); printf(msg); //显示接受信息 }while( !over ); closesocket(sock); printf("按任一键返回"); getch(); WSACleanup( ); return 0; } bool InitSocket() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); //初始化Windows Sockets DLL, err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { printf("没有Windows Socket动态库!\n"); getch(); return false; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) { printf("需要Windows Socket 2!\n"); getch(); WSACleanup( ); return false; } return true; } |
地主 发表时间: 04-05-26 20:28 |
![]() | 回复: NetDemon [netdemon] ![]() |
登录 |
这两段代码是要在Windows上编译、运行的。 |
B1层 发表时间: 04-05-27 13:20 |
![]() | 回复: cimsxiyang [cimsxiyang] ![]() |
登录 |
#pragma hdrstop //------------------------------------------------------- #include <conio.h> #include <stdio.h> //#include <winsock2.h> #include <afxsock> //------------------------------------------------------- ?????????????????? |
B2层 发表时间: 04-05-27 15:19 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号