免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
申猴
日期:2013-09-03 17:48:13
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-03 11:23 |只看该作者 |倒序浏览
小弟最近用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. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-06-03 13:07 |只看该作者
本帖最后由 txgc_wm 于 2013-06-03 13:08 编辑

你运行一下以下的测试程序,就明白错误所在了。
  1. #include <string.h>
  2. #include <stdio.h>

  3. int main(void)
  4. {
  5.         char buf[20] = {0};
  6.         char *test = "haha";
  7.         int len = 0;

  8.         len = strlen(test);
  9.         strcpy(buf, test);
  10.         buf[len] = '/0';  //错误在这里,正确的应该是buf[len] = "\0";

  11.         printf("string: %s\n", buf);

  12.         return 0;
  13. }
复制代码
编译提示的警告:
  1. $ gcc nullerr.c
  2. nullerr.c: In function ‘main’:
  3. nullerr.c:12:13: warning: multi-character character constant [-Wmultichar]
  4. nullerr.c:12:2: warning: overflow in implicit constant conversion [-Woverflow]
复制代码
错误的输出:
  1. $ ./a.out
  2. string: haha0
复制代码

论坛徽章:
1
申猴
日期:2013-09-03 17:48:13
3 [报告]
发表于 2013-06-03 13:29 |只看该作者
回复 2# txgc_wm


    恩,是的,谢了

论坛徽章:
0
4 [报告]
发表于 2013-06-03 13:37 |只看该作者
回复 3# wangjc_strive

不用客气,以后写程序的时候,一些基本的东西多注意就可以了。
   

论坛徽章:
1
申猴
日期:2013-09-03 17:48:13
5 [报告]
发表于 2013-06-03 16:19 |只看该作者
回复 4# txgc_wm


    你好,我的这个程序,当我在同一台电脑上运行server跟client时,client能够连接到server上,但是我在两台电脑上运行时,当我运行client时,总是打印connect error!!!:Connection timed out,后面的是通过errno打印出来的。
我在server上运行netstat,看到server端的端口是打开的,但是为什么client就链接不到server上呢?

论坛徽章:
0
6 [报告]
发表于 2013-06-07 10:49 |只看该作者
LINUX系统?检查下系统的防火墙。

论坛徽章:
0
7 [报告]
发表于 2013-06-11 15:26 |只看该作者
buf[len] = '/0';  //错误在这里,正确的应该是buf[len] = "\0";

似乎都不妥,觉得应该是buf[len]='\0',双引号占两个字节
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP