首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

崩溃了。为啥小弟我写的winsock老是recv失败呢?求指导!

2012-10-10 
崩溃了。。。为啥我写的winsock老是recv失败呢?求指导!!!小弟刚刚开始学socket,用winsock写了一个server,是先

崩溃了。。。为啥我写的winsock老是recv失败呢?求指导!!!
小弟刚刚开始学socket,用winsock写了一个server,是先socket然后bind,listen,accept,recv;client端是socket,connect,然后send 但是老是在recv这部出错,请众大牛指导一下啊。。。。。不胜感激~~


附代码:
服务器
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib")
#define MYPORT 4444 
#define BACKLOG 10
#define MAXDATASIZE 1024
int main()
{
  int err_code,sin_size,numbytes;
  int ser_sockfd,new_fd;
  char buf[MAXDATASIZE];
  WORD v;
  WSADATA WD;
  struct sockaddr_in my_addr,their_addr;
  v=MAKEWORD(1,1);
  err_code=WSAStartup(v,&WD);
  if(err_code!=0) 
  {
  printf("WSAStartup");
  system("pause");
  exit(1);
   
  }
  ser_sockfd=socket(AF_INET,SOCK_STREAM,0);
  if (ser_sockfd<0)
  {
  err_code=GetLastError();
printf("socket Error:%s\n",strerror(err_code));
system("pause");
  exit(1);
  }
  memset((struct sockaddr_in*)&my_addr,0,sizeof(struct sockaddr_in));
  my_addr.sin_family = AF_INET; 
  my_addr.sin_port = htons(MYPORT); 
  my_addr.sin_addr.s_addr = INADDR_ANY; 
  if (bind(ser_sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))<0)
  {
  err_code=GetLastError();
printf("bind Error:%s\n",strerror(err_code));
system("pause");
  exit(1);
  } 
  if (listen(ser_sockfd,BACKLOG)<0)
  {
  err_code=GetLastError();
printf("listen Error:%s\n",strerror(err_code));
system("pause");
  exit(1);
  }
  while (1)
  {
  sin_size = sizeof(struct sockaddr_in); 
  if (new_fd = accept(ser_sockfd, (struct sockaddr *)&their_addr, &sin_size)<=0)
  {
  err_code=GetLastError();
  printf("accept Error:%s\n",strerror(err_code));
system("pause");
  } else
  {  
  if (numbytes=recv(new_fd, buf, MAXDATASIZE, 0)<=0)
  {
  err_code=GetLastError();
printf("recv Error:%s\n",strerror(err_code));
system("pause");
  exit(1);
  }
  buf[numbytes] = '\0'; 
  printf("Received: %s\n",buf); 
  shutdown(new_fd,2); 
  }
  }
  shutdown(ser_sockfd,2);
  WSACleanup();
  system("pause");
}
客户端
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib")
#define DEST_PORT 4444 
#define MAXDATASIZE 1024
int main()
{
  int err_code,numbytes;
  char buf[MAXDATASIZE];
  int cli_sockfd;
  WORD v;
  WSADATA WD;
  struct sockaddr_in dest_addr;
  v=MAKEWORD(1,1);
  err_code=WSAStartup(v,&WD);
  char DEST_IP[14];
  if(err_code!=0) 
  {
  printf("WSAStartup");
  system("pause");
  exit(1);
  }
  cli_sockfd=socket(AF_INET,SOCK_STREAM,0);
  if (cli_sockfd<0)
  {
  err_code=GetLastError();
printf("socket Error:%s\n",strerror(err_code));


system("pause");
  exit(1);
  }
  printf("Please input server address:");
  scanf("%s",DEST_IP);
  memset((struct sockaddr_in*)&dest_addr,0,sizeof(struct sockaddr_in));
  dest_addr.sin_family = AF_INET; 
  dest_addr.sin_port = htons(DEST_PORT); 
  dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); 
  if (connect(cli_sockfd,(struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in))!=0)
  {
  err_code=GetLastError();
printf("connect Error:%s\n",strerror(err_code));
system("pause");
  exit(1);
  }  
  char msg[MAXDATASIZE];
  strcpy(msg,"hi,I am client!");
  if (send(cli_sockfd,msg,sizeof(msg),0)<0)
  {
  err_code=GetLastError();
printf("socket Error:%s\n",strerror(err_code));
system("pause");
  exit(1);
  }
  shutdown(cli_sockfd,2);
  WSACleanup();
  system("pause");
  return(1);
}



[解决办法]
if ((new_fd = accept(ser_sockfd, (struct sockaddr *)&their_addr, &sin_size))<=0)
if ((numbytes=recv(new_fd, (char*)buf, MAXDATASIZE, 0))<=0)

加括号啊
[解决办法]
小伙子都学网络编程了,有两本极为经典的书籍,C++网络编程,不薄不厚。

热点排行