免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1546 | 回复: 1
打印 上一主题 下一主题

[网络] 基于socket的一个小的服务器回射程序 [复制链接]

论坛徽章:
1
申猴
日期:2013-09-03 17:48:13
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-03 11:29 |只看该作者 |倒序浏览
本帖最后由 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”
  1. #include"unp.h"
  2. //server
  3. /*
  4. #include<sys/socket.h>//socket()
  5. #include<netinet/in.h>//sockaddr_in
  6. #include<stdio.h>//perror()
  7. #include<unistd.h>//fork()
  8. #include<stdlib.h>
  9. #include<errno.h>//errno, EINTR
  10. #include<string.h>//strlen()

  11. #define PORT 7788
  12. #define MAX_BUF 1000
  13. */

  14. void server_read(int sockfd);

  15. int main(int argc, char *argv[])
  16. {
  17.     int listenfd, connfd;
  18.     struct sockaddr_in cliaddr, servaddr;
  19.     pid_t childpid;
  20.     socklen_t clilen;

  21.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  22.     {
  23.         perror("socket error");
  24.     }
  25.     bzero(&servaddr, sizeof(servaddr));
  26.     servaddr.sin_family = AF_INET;
  27.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  28.     servaddr.sin_port = htons(PORT);
  29.     if( bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
  30.     {
  31.         perror("bind error");
  32.         exit(EXIT_FAILURE);
  33.     }
  34.     printf("bind OK\n");
  35.     if( listen(listenfd, 5) == -1)
  36.     {
  37.         perror("listen error");
  38.     }
  39.     printf("now listening \n");
  40.     for(;;)
  41.     {
  42.         clilen = sizeof(cliaddr);
  43.         connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
  44.         if(connfd == -1)
  45.         {
  46.             perror("accept error");
  47.         }
  48.         printf("now receive a new connect!!\n");
  49.         if( (childpid = fork()) == -1 )
  50.         {
  51.             perror("fork error");
  52.         }
  53.         else if(childpid == 0)//child
  54.         {
  55.             close(listenfd);
  56.             server_read(connfd);
  57.             exit(0);
  58.         }
  59.     }
  60.     close(connfd);
  61. }

  62. void
  63. server_read(int sockfd)
  64. {
  65.     unsigned int n;
  66.     char recebuf[MAX_LINE];
  67.    
  68.     bzero(recebuf, MAX_LINE);
  69. again:
  70.     while((n = read(sockfd, recebuf, MAX_LINE-1)) >0)
  71.     {
  72.         //fputs(recebuf, stdout);
  73.         recebuf[n] = '/0';
  74.         printf("server receive: %s\n",recebuf);
  75.         write(sockfd, recebuf, strlen(recebuf));
  76.         printf("server write: %s\n", recebuf);
  77.     }
  78.     if(n<0 && errno == EINTR)
  79.     {
  80.         goto again;   
  81.     }
  82.     else if(n<0)
  83.     {
  84.         perror("read or write error");
  85.     }
  86. }
复制代码
  1. #include"unp.h"
  2. //client
  3. /*
  4. #include<sys/socket.h>//socket() bind()...
  5. #include<stdio.h>//perror
  6. #include<arpa/inet.h>//inet_pton()
  7. #include<string.h>//bzero()
  8. #include<stdlib.h>//exit()


  9. #define port 7788
  10. #define MAX_LINE 1000
  11. */

  12. void client_read(FILE *fp, int sockfd);

  13. int
  14. main(int argc, char **argv)
  15. {
  16.     int sockfd;
  17.     char *str;
  18.     struct sockaddr_in cliaddr;

  19.     if(argc != 2)
  20.     {
  21.         printf("input right canshu");
  22.         exit(1);
  23.     }
  24.     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  25.     {
  26.         perror("socket error");
  27.     }
  28.     bzero(&cliaddr, sizeof(cliaddr));
  29.     cliaddr.sin_family = AF_INET;
  30.     cliaddr.sin_port = htons(port);
  31.     if( inet_pton(AF_INET, argv[1], &cliaddr.sin_addr) !=1 )
  32.     {
  33.         printf("inet_pton error");
  34.     }
  35.     if((connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr))) == -1)
  36.     {
  37.         perror("connect error!!!");
  38.         exit(0);
  39.     }
  40.     client_read(stdin, sockfd);
  41. }
  42. void
  43. client_read(FILE *fp, int sockfd)
  44. {
  45.     char writebuf[MAX_LINE], recvbuf[MAX_LINE];
  46.    
  47.     bzero(writebuf, MAX_LINE);
  48.     bzero(recvbuf, MAX_LINE);
  49.     while( (fgets(writebuf, MAX_LINE, fp)) != NULL )
  50.     {
  51.         
  52.         printf("your input is: %s\n", writebuf);
  53.         write(sockfd, writebuf, strlen(writebuf));
  54.         printf("client write: %s\n",writebuf);
  55.         if((read(sockfd, recvbuf, MAX_LINE)) ==0 )
  56.         {
  57.             printf("read zero\n");   
  58.         }
  59.         //fputs(recvbuf, stdout);
  60.         printf("client receive: %s\n", recvbuf);
  61.     }
  62. }
复制代码

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
2 [报告]
发表于 2013-06-03 12:14 |只看该作者
server的78行'/0'应为'\0'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP