我写了个简单的网络程序~~但服务端的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);
}
>> 本文固定链接: http://www.vcgood.com/archives/633
错误主要有如下几个:
将两本程序中的所有
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!
谢谢斑竹~~我是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[]
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,因为是个地址。
呵呵~~谢谢了~~~这下又清楚了不少东西