论坛: UNIX系统 标题: 这个套接口的程序编译有问题,请高手看看! 复制本贴地址    
作者: 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]   ADMIN   登录
这两段代码是要在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

论坛: UNIX系统

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号