首页 > 用户发贴区 > 编程问题提问区 > 求助:网络编程中遇见的一个问题
2006
04-11

求助:网络编程中遇见的一个问题

我写了个简单的网络程序~~但服务端的printf(“%s”,buff),不起作用,不知道为什么,希望哪位大虾可以帮忙解决下.~~原程序如下:


//客户端
#include “winsock.h”
#include “windows.h”
#include “stdio.h”
#include “stdlib.h”
#include “string.h”
#pragma comment(lib,”wsock32.lib”)
#define RECV_PORT 1800
#define SEND_PORT 1860
#define MAX_FILESIZE 1024*10


SOCKET sock,sock1;
sockaddr_in ServerAddr;


DWORD StartSock()
{
 WSADATA WSAData;
 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
 {
  printf(“socket初始化失败!\n”);
  return(-1);
 }
 ServerAddr.sin_family=AF_INET;
 ServerAddr.sin_addr.s_addr=inet_addr(“10.10.3.5″);
 ServerAddr.sin_port=htons(RECV_PORT);
 return(1);
}


DWORD CreateSocket()
{
 sock=socket(AF_INET,SOCK_STREAM,0);
 if(sock==SOCKET_ERROR)
 {  
  printf(“socket创建失败!”);
  WSACleanup();
  return(-1);
 }
 return(1);
}


DWORD CallServer()
{
 CreateSocket();
 while(connect(sock,(struct sockaddr *) &ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
 {
  printf(“连接中!\n”);
  return(-1);
 }
 return(1);
}


DWORD TCPSendPacket(char c[])
{
 int length;
 length=send(sock,c,sizeof(c),0);
 if(length<=0)
 {
  printf(“发送文件错误!\n”);
  closesocket(sock);
  WSACleanup();
  return(-1);
 }
 return(1);
}


int main()
{
 char a[20];
 char buff[50];
 printf(“请输入字符:”);
 scanf(“%s”,&a);
 memset(buff,0,sizeof(buff));
 strcpy(a,buff);
 if(StartSock()==-1)
  return(-1);
 if(CallServer()==-1)
  return(-1);
 if(TCPSendPacket(buff)==-1)
  return(-1);
// closesocket(sock);
 return(1);
}


 //服务器
#include “winsock.h”
#include “windows.h”
#include “stdio.h”
#include “stdlib.h”
#include “string.h”
#pragma comment(lib,”wsock32.lib”)
#define RECV_PORT 1800
#define SEND_PORT 1860
#define MAX_FILESIZE 1024*10


SOCKET sock,sock1;
sockaddr_in ServerAddr;
sockaddr_in ClientAddr;


struct Filedata
{
 char ffname[30];
 char ffdata[MAX_FILESIZE];
 int len;
}DataPacket;


DWORD StartSock()
{
 WSADATA WSAData;
 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
 {
  printf(“socket初始化失败!\n”);
  return(-1);
 }
 sock=socket(AF_INET,SOCK_STREAM,0);
 if(sock==SOCKET_ERROR)
 {
  printf(“socket创建失败!\n”);
  WSACleanup();
  return(-1);
 }
 ServerAddr.sin_family=AF_INET;
 ServerAddr.sin_addr.s_addr=inet_addr(“10.10.3.5″);//ht onl(INADDR_ANY);
 ServerAddr.sin_port=htons(RECV_PORT);
 if(bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
 {
  printf(“socket绑定失败!”);
  return(-1);
 }
 return(1);
}


DWORD ConnectProcess()
{
 int Addrlen;
 char buff[80];
 Addrlen=sizeof(sockaddr_in);
 if(listen(sock,5)<0)
 {
  printf(“监听失败!”);
  return(-1);
 }
 printf(“监听中…..\n”);
 for(;;)
 {
  sock1=accept(sock,(struct sockaddr FAR *)&ClientAddr,&Addrlen);
  for(;;)
  {
   memset(buff,0,80);
   if(recv(sock1,buff,sizeof(buff),0)<=0)
   {
    break;
   }
   printf(“%s”,buff);
   printf(“已经接收!\n”);   
  }
 }
}
 
int main()
{
 if(StartSock()==-1)
  return(-1);
 if(ConnectProcess()==-1)
  return(-1);
 return(1);
}
 


求助:网络编程中遇见的一个问题》有 4 条评论

  1. xstar 说:

    错误主要有如下几个:
    将两本程序中的所有
    sockadd_in
    都改为
    struct sockadd_in
    //我不知道你用的是什么编译器,总之在VC6SP6上编译不通过

    下面两个是关键错误:
    //client.c中
    1:
    //DWORD TCPSendPacket( char *c ) 这里最好从 char c[]改为char *c
    length = send( sock, c, sizeof( c ), 0 );
    改为
    length = send( sock, c, strlen( c ), 0 );
    //形参中的数组自动转换为指针,况且你这里本来就是指针

    2:
    //int main()
    strcpy( a, buff );
    改为
    strcpy( buff, a );
    //具体什么原因我就不说了,自己去看strcpy的定义

    附上修改过的代码(Win2K3 + VS6SP6编译运行通过)
     //server
    #include “winsock.h”
    #include “windows.h”
    #include “stdio.h”
    #include “stdlib.h”
    #include “string.h”
    #pragma comment(lib,”wsock32.lib”)
    #define RECV_PORT 1800
    #define SEND_PORT 1860
    #define MAX_FILESIZE 1024*10

    SOCKET sock,sock1;
    struct sockaddr_in ServerAddr;
    struct sockaddr_in ClientAddr;

    struct Filedata
    {
     char ffname[30];
     char ffdata[MAX_FILESIZE];
     int len;
    }DataPacket;

    DWORD StartSock()
    {
     WSADATA WSAData;
     if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
     {
      printf(“socket init error!\n”);
      return(-1);
     }
     sock=socket(AF_INET,SOCK_STREAM,0);
     if(sock==SOCKET_ERROR)
     {
      printf(“socket create error!\n”);
      WSACleanup();
      return(-1);
     }
     ServerAddr.sin_family=AF_INET;
     ServerAddr.sin_addr.s_addr=inet_addr(“192.168.1.233″); //ht onl(INADDR_ANY);
     ServerAddr.sin_port=htons(RECV_PORT);
     if(bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
     {
      printf(“socket bind error!”);
      return(-1);
     }
     return(1);
    }

    DWORD ConnectProcess()
    {
     int Addrlen;
     char buff[80];
     Addrlen=sizeof(struct sockaddr_in);
     if(listen(sock,5)<0)
     {
      printf(“listen error!”);
      return(-1);
     }
     printf(“listenning…..\n”);
     for(;;)
     {
      sock1=accept(sock,(struct sockaddr FAR *)&ClientAddr,&Addrlen);
      for(;;)
      {
       memset(buff,0,80);
       if(recv(sock1,buff,sizeof(buff),0)<=0)
       {
        break;
       }
       printf(“%s\n”,buff);
       printf(“recved!\n”);  
      }
     }
    }
     
    int main()
    {
     if(StartSock()==-1)
      return(-1);
     if(ConnectProcess()==-1)
      return(-1);
     return(1);
    }

    //client.c
    #include “winsock.h”
    #include “windows.h”
    #include “stdio.h”
    #include “stdlib.h”
    #include “string.h”
    #pragma comment(lib,”wsock32.lib”)
    #define RECV_PORT 1800
    #define SEND_PORT 1860
    #define MAX_FILESIZE 1024*10

    SOCKET sock,sock1;
    struct sockaddr_in ServerAddr;

    DWORD StartSock()
    {
     WSADATA WSAData;
     if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
     {
      printf(“socket Init Error!\n”);
      return(-1);
     }
     ServerAddr.sin_family=AF_INET;
     ServerAddr.sin_addr.s_addr=inet_addr(“192.168.1.233″);
     ServerAddr.sin_port=htons(RECV_PORT);
     return(1);
    }

    DWORD CreateSocket()
    {
     sock=socket(AF_INET,SOCK_STREAM,0);
     if(sock==SOCKET_ERROR)
     { 
      printf(“socket create error!”);
      WSACleanup();
      return(-1);
     }
     return(1);
    }

    DWORD CallServer()
    {
     CreateSocket();
     while(connect(sock,(struct sockaddr *) &ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
     {
      printf(“connect error!\n”);
      return(-1);
     }
     return(1);
    }

    DWORD TCPSendPacket(char *c)
    {
     int length;
     length=send(sock,c,strlen(c),0);
     if(length<=0)
     {
      printf(“send buf\n”);
      closesocket(sock);
      WSACleanup();
      return(-1);
     }
     return(1);
    }

    int main()
    {
     char a[20];
     char buff[50];
     printf(“Please Input string:”);
     scanf(“%s”,&a);
     memset(buff,0,sizeof(buff));
     //strcpy(a,buff);
    strcpy( buff, a );
     if(StartSock()==-1)
      return(-1);
     if(CallServer()==-1)
      return(-1);
     if(TCPSendPacket(buff)==-1)
      return(-1);
     closesocket(sock);
     return(1);
    }

    另外一点建议是:全局变量尽量少用,代码要规范.

    Good Luck!

  2. 逃往幸福 说:

    谢谢斑竹~~我是vc++编译器~~~

    2:
    //int main()
    strcpy( a, buff );
    改为
    strcpy( buff, a );
    //具体什么原因我就不说了,自己去看strcpy的定义
    这个地方的问题,其他没什么问题

     

    1:
    //DWORD TCPSendPacket( char *c ) 这里最好从 char c[]改为char *c
    length = send( sock, c, sizeof( c ), 0 );
    改为
    length = send( sock, c, strlen( c ), 0 );
    //形参中的数组自动转换为指针,况且你这里本来就是指针
    vc++里和vc里char[]和char *有很大区别~~vc++中应为char[]

  3. xstar 说:

    char c[]和char *c是有区别,但不是vc++和vc的区别,具体而言char c[]是数组,char *c是指针。
    不过因为数组名在内存中是数组的第一个元素的地址,而指针就是地址。所以这两者有时可以灵活转换。
    另外有一点要注意,char c[],可以认为是const型的指针。

    至于这两个在使用时用哪个的问题,推荐或者坚决使用char *c,这点可以看看标准库里各个函数的实现,比如strcpy等函数。

    还有程序中strlen( c )和sizeof( c )是有很大区别的,这里不管你用char[]或char*也好,sizeof( c )得到的都是4,因为是个地址。

  4. 逃往幸福 说:

    呵呵~~谢谢了~~~这下又清楚了不少东西

留下一个回复