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

网络编程send和recv的有关问题

2013-08-01 
网络编程send和recv的问题在linux下,按照网上的资源,编写了client和server函数。想在client端不停地输入字

网络编程send和recv的问题
在linux下,按照网上的资源,编写了client和server函数。想在client端不停地输入字符串,
然后在server端打印出来。
出现的问题是,先启动server端,启动client之后,server迅速就关闭了。。。

server代码:


/*
  server1.c 
  2013-7-24
 */

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define BUFFER_SIZE 1024
#define SERVPORT 3333

int main()
{
  char buffer[BUFFER_SIZE];

  //********** create socket ******************
  int sockfd;
  struct sockaddr_in serv;
  struct sockaddr_in client;
  sockfd=socket(AF_INET,SOCK_STREAM,0);
  perror("socket");
  printf("errno %d\n",errno);
  // printf("sockfd %d\n",sockfd);
  if( sockfd < 0 )
    {
      return 0;
    }

  //************* bind **********************
  bzero(&serv,sizeof(serv));
  serv.sin_family = AF_INET;
  serv.sin_port = htons(SERVPORT);
  serv.sin_addr.s_addr = INADDR_ANY;
  int bindFlag;
  bindFlag = bind(sockfd,(struct sockaddr*)&serv,sizeof(struct sockaddr));
  perror("bind");
  printf("errno %d\n",errno);
  // printf("sockfd %d inetFlag %d\n",sockfd,inetFlag);
  if( bindFlag < 0)
    {
      return 0;
    }

  //************** listen *********************
  int listenFlag;
  int backlog = 5;
  listenFlag = listen(sockfd,backlog);
  perror("listen");
  if( listenFlag < 0) 
    {
      return 0;
    }

  //************** accept ********************
  socklen_t addr_len = sizeof(sockaddr_in);
  int acceptFlag;
  acceptFlag = accept(sockfd,(struct sockaddr*)&client,&addr_len);
  perror("accept");
  if( acceptFlag<0 )
    {


      return 0;
    } 

  //************** recv ***********************
  while(1)
    {
      memset(buffer,0,sizeof(buffer));
      int recvBytes = recv(sockfd,buffer,BUFFER_SIZE-1,0);
      if(recvBytes == 0 || recvBytes == -1)
    {
      printf("client closed");
      return 0;
    }
      printf("recv:%s\n",buffer);
    }
  system("pause");
  return 0;
}


-----------------------------------------------
client端代码:

/*
  net program
  2013-7-23
 */

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define BUFFER_SIZE 1024

int main()
{
  char buffer[BUFFER_SIZE];

  //********** create socket ******************
  int sockfd;
  struct sockaddr_in dest;
  sockfd=socket(AF_INET,SOCK_STREAM,0);
  perror("socket");
  printf("errno %d\n",errno);
  // printf("sockfd %d\n",sockfd);
  if( sockfd < 0 )
    {
      printf("Create Socket Error.\n");
      return 0;
    }

  bzero(&dest,sizeof(dest));
  dest.sin_family = AF_INET;
  dest.sin_port = htons(3333);
  int inetFlag;
  //inetFlag = inet_aton("192.168.123.5",(struct 
in_addr*)&dest.sin_addr.s_addr);
  inetFlag = inet_aton("127.0.0.1",(struct in_addr*)&dest.sin_addr.s_addr);
  perror("inet_aton");
  printf("errno %d\n",errno);
  // printf("sockfd %d inetFlag %d\n",sockfd,inetFlag);
  if( inetFlag == 0)
    {
      printf("set error.\n");
      return 0;
    }



  //************** connect *********************
  int connectFlag;
  connectFlag = connect(sockfd, (struct sockaddr *) &dest, sizeof(dest));
  perror("connect");
  printf("errno %d\n",errno);
  // int errFlag = GetLastError();
  // printf("sockfd %d connectFlag %d\n",sockfd,connectFlag);
  if( connectFlag < 0) 
    {
      //printf("sockfd = %d\n",sockfd);
      //printf("Connect error.\n");
      return 0;
    }

  //************** send ***********************
  while(1)
    {
      printf("输入一个字符串:");
      scanf("%s",buffer);
      int ret = send(sockfd,buffer,strlen(buffer),0);
      if(ret==0 || ret==-1)
    {
      printf("server closed");
      return 0;
    }
    }
  system("pause");
  return 0;
}


-----------------------------
编译:
    g++ -o c1 client1.c
    g++ -o s1 server1.c

打开两个终端,其中一个执行服务器程序:
    ./s1
立即打印:
    socket:Success
    errno:0
    bind:Success
    errno:0
    listen:Success
然后就停住了。

这时在另外一个终端上执行客户端程序:
    ./c1
立即打印:
    socket:Success
    errno:0
    inet_aton:Success
    errno:0
    connect:Success
    errno:0
    输入一个字符串:
同时服务器端打印2行:
    accept:Success
    client closed
并立即退出。

我是想让服务器端阻塞,然后客户端输一行,服务器端显示一行。
这个错误在哪儿?


[解决办法]
gdb上去看看recv的流程和返回值。
[解决办法]


while(1)
    {
      printf("输入一个字符串:");
      scanf("%s",buffer);
      int ret = send(sockfd,buffer,strlen(buffer),0);
      if(ret==0 
[解决办法]
 ret==-1)
    {
      printf("server closed");
      return 0;
    }
    }


ret==0时,不需要return;


int ret = send(sockfd,buffer,strlen(buffer),0);
      if(ret==-1)
    {
      printf("server closed");
      return 0;
    }

改着试试看?
[解决办法]
你用的不是winsock,有的变量或者函数不太一样。
我发现一个问题,服务端应该有2个socket,1个用于监听,accpet函数返回另外一个socket用于代表client的连接,recv应该在client的socket,而不是监听的那个socket

用winsock的服务器流程是这样处理的。

[解决办法]
 //int recvBytes = recv(sockfd,buffer,BUFFER_SIZE-1,0);//你这是啥意思呢?
 int recvBytes = recv(acceptFlag,buffer,BUFFER_SIZE-1,0);
//这样才是对的,accept成功后返回的套接字,才是和客户端之间进行通讯的套接字的
//而且recv本身就是阻塞函数,能满足你的要求

热点排行