首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

socket编程 老是accept error 新手入门 希望大家帮帮忙 具体代码如下

2013-11-15 
socket编程 总是accept error新手入门希望大家帮帮忙 具体代码如下这个程序是想实现客户机发送256个字符,

socket编程 总是accept error 新手入门 希望大家帮帮忙 具体代码如下
这个程序是想实现客户机发送256个字符,服务器将这256个字符顺序颠倒然后返回

server.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <signal.h>
#define SERVER_PORT 8086
#define BACKLOG 5

void serv_respon(int sockfd)
{
  int nbytes;
  char buf_send[1024];
  char buf_recv[1024];

  nbytes=read(sockfd,buf_recv,256);
  if(nbytes==0)
  {
    return;
  }
  else if(nbytes<0)
  {
   fprintf(stderr,"read error");
   exit(1);
  }
  char*pc_recv=buf_recv+255;
  char*pc_send=buf_send;
  int i;
 
  for(i=0;i<256;i++)
  {
    *pc_send=*pc_recv;
    pc_send++;
    pc_recv--;
  }

  nbytes=write(sockfd,buf_send,256);
  if(nbytes<0)
  {
    fprintf(stderr,"write error");
    exit(1);
  }
}

int main( )
{
  int listenfd,connfd,addrlen;
  struct sockaddr_in servaddr,clientaddr;
  listenfd=socket(AF_INET,SOCK_STREAM,0);
  if(listenfd<0)
  {
    fprintf(stderr,"socket error");
    exit(1);
  }
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family=AF_INET;
  servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  servaddr.sin_port=htons(SERVER_PORT);
  if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
  {
    fprintf(stderr,"bind error");
    exit(1);
  }
  addrlen = sizeof(servaddr);
  for(;;)
  {
    connfd=accept(listenfd,(struct sockaddr*)&clientaddr,&addrlen);
    if(connfd == -1)
    {
      fprintf(stderr,"accept error");
     exit(1);
    }
    serv_respon(connfd);
    close(connfd);
  }
  close(listenfd);
}


client.c
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <signal.h>
#define SERVER_PORT 8086

void cli_requ(int sockfd)
{
  char buf[1024];
  int i,n;
  srand((unsigned)time(NULL));
  for(i=0;i<256;i++)
  {
    buf[i]=random()%(256);
  }
  int nbytes=write(sockfd,buf,256);
  if(nbytes<0)
  {
     fprintf(stderr,"write error");
     exit(1);
  }
  nbytes=read(sockfd,buf,512);
  if(nbytes<0||nbytes==0)
  {
  fprintf(stderr,"read error");
  exit(1);
  }
}


int main( )
{
   int sockfd;
   struct sockaddr_in servaddr;
   sockfd=socket(AF_INET,SOCK_STREAM,0);
   if(sockfd<0)
   {
     fprintf(stderr,"socket error"); 
     exit(1);
   }
   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family=AF_INET;
   servaddr.sin_port=htons(SERVER_PORT);
   if(inet_aton("127.0.0.1",&servaddr.sin_addr.s_addr)==-1)
   {
     fprintf(stderr,"addr convert error");
     exit(1);
   }
   if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
   {
    fprintf(stderr,"connect error");
    exit(1);
   }
   cli_requ(sockfd);
   close(sockfd);
}


[解决办法]
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);

改成:
servaddr.sin_addr.s_addr=INADDR_ANY;

htonl是把端口号改成大端模式的,这接收的是ip地址,不答界的
[解决办法]
你这是基于tcp的服务器端bind函数之后还要listen()才能用accept()。


[解决办法]

引用:
哦,你应该说的是不搭边吧?


[解决办法]
看到caoshufengcao的回复, 直接瞎眼了...

你是专门误导人的?
[解决办法]
引用:
你这是基于tcp的服务器端bind函数之后还要listen()才能用accept()。

++
[解决办法]
可以在connect后面调用
printf("errno is:%d-%s\n",errno,strerror(errno));
查看一下错误码类似于windows GetlastError的功能,
同时把127.0.0.1改成本地IP地址试一试。

热点排行