wangjc_strive 发表于 2013-06-03 11:29

基于socket的一个小的服务器回射程序

本帖最后由 wangjc_strive 于 2013-06-03 11:32 编辑

小弟最近用socket写了一个c/s的小程序,客户端发一段字符给服务器,服务器收到该段字符后,将其再发回给客户端,我二者链接建立好后,我用客户端发字符的时候,服务器端总是会收到额外的字符,下面是问题的截图,以及我的代码,希望哪位高手给点指点,我知道应该是read跟write的地方有问题。
首先server端监听到了client端的链接,打印now receive a new connect!!   然后我在client端输入first line input,为什么server却收到了“first line input”,后面还跟了个“0”
#include"unp.h"
//server
/*
#include<sys/socket.h>//socket()
#include<netinet/in.h>//sockaddr_in
#include<stdio.h>//perror()
#include<unistd.h>//fork()
#include<stdlib.h>
#include<errno.h>//errno, EINTR
#include<string.h>//strlen()

#define PORT 7788
#define MAX_BUF 1000
*/

void server_read(int sockfd);

int main(int argc, char *argv[])
{
    int listenfd, connfd;
    struct sockaddr_in cliaddr, servaddr;
    pid_t childpid;
    socklen_t clilen;

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
      perror("socket error");
    }
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);
    if( bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
    {
      perror("bind error");
      exit(EXIT_FAILURE);
    }
    printf("bind OK\n");
    if( listen(listenfd, 5) == -1)
    {
      perror("listen error");
    }
    printf("now listening \n");
    for(;;)
    {
      clilen = sizeof(cliaddr);
      connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
      if(connfd == -1)
      {
            perror("accept error");
      }
      printf("now receive a new connect!!\n");
      if( (childpid = fork()) == -1 )
      {
            perror("fork error");
      }
      else if(childpid == 0)//child
      {
            close(listenfd);
            server_read(connfd);
            exit(0);
      }
    }
    close(connfd);
}

void
server_read(int sockfd)
{
    unsigned int n;
    char recebuf;
   
    bzero(recebuf, MAX_LINE);
again:
    while((n = read(sockfd, recebuf, MAX_LINE-1)) >0)
    {
      //fputs(recebuf, stdout);
      recebuf = '/0';
      printf("server receive: %s\n",recebuf);
      write(sockfd, recebuf, strlen(recebuf));
      printf("server write: %s\n", recebuf);
    }
    if(n<0 && errno == EINTR)
    {
      goto again;   
    }
    else if(n<0)
    {
      perror("read or write error");
    }
}#include"unp.h"
//client
/*
#include<sys/socket.h>//socket() bind()...
#include<stdio.h>//perror
#include<arpa/inet.h>//inet_pton()
#include<string.h>//bzero()
#include<stdlib.h>//exit()


#define port 7788
#define MAX_LINE 1000
*/

void client_read(FILE *fp, int sockfd);

int
main(int argc, char **argv)
{
    int sockfd;
    char *str;
    struct sockaddr_in cliaddr;

    if(argc != 2)
    {
      printf("input right canshu");
      exit(1);
    }
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
      perror("socket error");
    }
    bzero(&cliaddr, sizeof(cliaddr));
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(port);
    if( inet_pton(AF_INET, argv, &cliaddr.sin_addr) !=1 )
    {
      printf("inet_pton error");
    }
    if((connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr))) == -1)
    {
      perror("connect error!!!");
      exit(0);
    }
    client_read(stdin, sockfd);
}
void
client_read(FILE *fp, int sockfd)
{
    char writebuf, recvbuf;
   
    bzero(writebuf, MAX_LINE);
    bzero(recvbuf, MAX_LINE);
    while( (fgets(writebuf, MAX_LINE, fp)) != NULL )
    {
      
      printf("your input is: %s\n", writebuf);
      write(sockfd, writebuf, strlen(writebuf));
      printf("client write: %s\n",writebuf);
      if((read(sockfd, recvbuf, MAX_LINE)) ==0 )
      {
            printf("read zero\n");   
      }
      //fputs(recvbuf, stdout);
      printf("client receive: %s\n", recvbuf);
    }
}

井蛙夏虫 发表于 2013-06-03 12:14

server的78行'/0'应为'\0'
页: [1]
查看完整版本: 基于socket的一个小的服务器回射程序