免费注册 查看新帖 |

Chinaunix

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

[C] socket 编程一对一 客户端显示错误-问题解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-13 16:29 |只看该作者 |倒序浏览
//chat_serv.c
#include<stdlib.h>
#include<stdio.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<unistd.h>
#include<fcntl.h>
#define MAXDATASIZE 256
#define SERVPORT    5555  
#define BACKLOG     1     //最大同时连接请求
#define STDIN       0
int main(void)
  {
          FILE *fp;   
          int sockfd, client_fd;  //监听socket.sock_fd, 数据传输socket.new_fd
          int sin_size;
          struct sockaddr_in my_addr, remote_addr;  //本机地址信息, 客户端地址信息         
          char buf[256];  //用于聊天的缓冲区
          char buf_name[256];  
          char send_str[256];  
         
          int recvbytes;
          fd_set rfd_set, wfd_set, efd_set; // 被select监听的读写异常处理的文件描述符集合
          struct timeval timeout;
          int ret;         
                   
          if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) ==-1)
                  {
                          herror("socket\n");
                          exit(1);
                          }        
          bzero(&my_addr,sizeof(struct sockaddr_in));  //端填充sockaddr结构
          my_addr.sin_family = AF_INET;
          my_addr.sin_port = htons(SERVPORT);
          inet_aton("127.0.0.1", &my_addr.sin_addr);
         
          if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
                  {                         
                          herror("bind");
                          exit(1);
                          }
         
          if (listen(sockfd, BACKLOG) == -1)
                  {                         
                          herror("listen");
                          exit(1);                         
                          }
                         
          sin_size = sizeof(struct sockaddr_in);
         
          if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) ==-1)
                  {                         
                          herror("accept");
                          exit(1);
                          }
         
          fcntl(client_fd, F_SETFD, O_NONBLOCK);//将服务器设置非阻塞         
         
          recvbytes = recv(client_fd, buf_name, MAXDATASIZE, 0);//接收从客户端传来的用户名
          buf_name[recvbytes] = '\0';
          printf("recv one account : %s\n", buf_name);
          printf("server : ");         
          fflush(stdout);
         
          if ((fp = fopen("name.txt", "a+")) ==NULL)
                  {                         
                          printf("can not open file, exit ... \n");
                          exit(1);                         
                          }
          fprintf(fp, "%s\n", buf_name);  //将用户名写入name.txt
          fclose(fp);
         
          while(1)
            {
                    FD_ZERO(&rfd_set);
                    FD_ZERO(&wfd_set);
                    FD_ZERO(&efd_set);
                   
                    FD_SET(STDIN, &rfd_set);  
                    FD_SET(client_fd, &rfd_set);                   
                    FD_SET(client_fd, &efd_set);                   
                    timeout.tv_sec = 10;  //超时设置
                    timeout.tv_usec = 0;
                   
                    ret = select(client_fd+1, &rfd_set, &wfd_set, &efd_set, &timeout);
                    if (ret == 0)
                            {
                                    continue;
                                    }
                    if (ret < 0)
                            {
                                    herror("select error : ");
                                    exit(-1);
                                    }
                    if (FD_ISSET(STDIN, &rfd_set))
                            {
                                   
                                   
                                    fgets(send_str, 255, stdin); //获取从标准输入输入的内容
                                    send_str[strlen(send_str)-1] = '\0';
                                   
                                    if (strncmp("exit", send_str, 4) == 0)
                                            {
                                                    close(client_fd);
                                                    close(sockfd);
                                                    exit(0);
                                                   
                                                    }
                                                   
                                    send(client_fd, send_str, strlen(send_str), 0);
                                    fprintf(stderr, "server :");
                                   
                                    }
                    if (FD_ISSET(client_fd, &rfd_set))
                            {
                                   
                                    recvbytes = recv(client_fd, buf, MAXDATASIZE, 0);//接收从客户端传来的聊天程序
                                   
                                    if (recvbytes == 0)
                                            {
                                                    puts("\n");
                                                    close(client_fd);
                                                    close(sockfd);
                                                    exit(0);
                                                    }
                                                                                       
                                    buf[recvbytes] = '\0';                         
                                                                                                                                  
                                    fprintf(stderr,"\n %s : %s\n", buf_name, buf);                                   
                              printf("server : ");
                                    fflush(stdout);           
                             }                        
                   
                                   
                    if (FD_ISSET(client_fd, &efd_set))
                            {
                                    close(client_fd);
                              close(sockfd);
                                    exit(0);
                                   
                                    }
                    } //end while
                  
         
          }//end main

[ 本帖最后由 cnlag01 于 2009-9-13 21:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-13 16:29 |只看该作者
//chat_client.c
//建立socket -- 请求连接connect -- 发送数据send -- 接收数据 recv -- 关闭close

#include<stdlib.h>
#include<stdio.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<unistd.h>
#include<fcntl.h>

#define SERVPORT      5555  //服务端口
#define MAXDATASIZE   256   //最大同时连接数
#define STDIN         0            // 标准输入描述符

int main()
  {
         
    //if (argc != 2) return;
          int sockfd;   //套接字描述符
          int recvbytes;
         
          char buf[MAXDATASIZE];   //输入缓冲区
          char *str;
         
          char name[MAXDATASIZE];  //定义用户名
          char send_str[MAXDATASIZE]; //单次最大发出的字符
         
          struct sockaddr_in serv_addr;  //Internet 套接字描述符
          fd_set rfd_set, wfd_set, efd_set;
          struct timeval timeout;
          int ret;
         
         
         
          if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
                  {
                          herror("sock");
                          exit(1);
                         
                          }
                         
          bzero(&serv_addr, sizeof(struct sockaddr_in));//填充sockaddr 结构
         
          serv_addr.sin_family = AF_INET;
          serv_addr.sin_port = htons(SERVPORT);
          serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
         
          if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) ==-1)
                  {
                          herror("connect ");
                          exit(1);
                          }
                         
          fcntl(sockfd, F_SETFD, O_NONBLOCK); //设置为非阻塞
         
          fprintf(stderr, "Please input your name :");
          scanf("%s", name);
          name[strlen(name)] = '\0';
         
          fprintf(stderr, " The name [%s] has been iuputed.\n", name);
          fprintf(stderr, "%s --1 :", name);
         
          //fflush(stdout);
         
          send(sockfd, name, strlen(name), 0); //发送用户名
         
          while(1)
            {
                    FD_ZERO(&rfd_set);
                    FD_ZERO(&wfd_set);
                    FD_ZERO(&efd_set);
                   
                    FD_SET(STDIN, &rfd_set);
                    FD_SET(sockfd, &rfd_set);                   
                    FD_SET(sockfd, &efd_set);
                   
                    timeout.tv_sec = 10;  //在被监视窗口等待的时间
                    timeout.tv_usec = 0;
                   
                    ret = select(sockfd+1, &rfd_set, &wfd_set, &efd_set, &timeout); //等待描述符状态改变
                   
                    if (ret == 0)
                            continue;
              if (ret < 0)
                      {
                              herror("select");
                              exit(-1);
                             
                              }
              if (FD_ISSET(STDIN, &rfd_set))
                      {
                             
                              fgets(send_str, 255, stdin);
                              send_str[strlen(send_str)-1] = '\0';
                             
                              if (strncmp("exit", send_str, 4) ==0)
                                      {
                                              close(sockfd);
                                              exit(0);
                                              }
                              fprintf(stderr, "%s --2  : ", name);                 // 问题所在  问题所在  问题所在  问题所在  问题所在
                              send(sockfd, send_str, strlen(send_str), 0);
                             
                             
                              }
              if (FD_ISSET(sockfd, &rfd_set))
                      {
                             
                              recvbytes = recv(sockfd, buf, MAXDATASIZE, 0);
                             
                              if (recvbytes == 0)
                                      {
                                              puts("\n");
                                              close(sockfd);
                                              exit(0);
                                              }
                                             
                              buf[recvbytes] = '\0';
                              fprintf(stderr, "\n Server : %s \n", buf);
                              fprintf(stderr,"%s :  ", name);
                        
                        
                              }
              if (FD_ISSET(sockfd, &efd_set))
                      {
                              close(sockfd);
                              exit(0);
                              }
                   
                   
                    }
          }

论坛徽章:
0
3 [报告]
发表于 2009-09-13 16:31 |只看该作者
问题

截图00.JPG (48.2 KB, 下载次数: 24)

截图00.JPG

论坛徽章:
0
4 [报告]
发表于 2009-09-13 17:02 |只看该作者
fprintf(stderr, "%s --2  : ", name);
换成:
fprintf(stdout, "%s --2  : ", name);

好像行了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-09-13 17:07 |只看该作者
现在的年轻人啊,除了截屏就不会交流信息了?

文字信息和图片信息各自的优缺点都不能明晰……
看起来实在是没有搞计算机的天赋啊……

论坛徽章:
0
6 [报告]
发表于 2009-09-13 21:56 |只看该作者
LS  的 LS  多谢了 ,, 能说下是什么原因么,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP