免费注册 查看新帖 |

Chinaunix

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

求教啊!关于socket tcp 通信问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-23 10:49 |只看该作者 |倒序浏览
//Client.c//
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<error.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<netdb.h>

#define  server_port 1234
#define MAXDATASIZE 2048

int main(int argc, char *argv[]) {
        FILE *fd;
        int sockfd,recvbytes,sendbytes,writebytes;
        char buf[MAXDATASIZE];
        struct hostent *host;
        struct sockaddr_in serv_addr;
        if(argc != 4) {
             fprintf(stderr,"client [-t]  hostname files \n\t [-s] hostname message_info \n");
             exit(1);
        }
        if((host = gethostbyname(argv[2])) ==NULL) {
                perror("gethostbyname");
                exit(1);
        }
        if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
                perror("socket faild");
                exit(1);
        }

        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(server_port);
        serv_addr.sin_addr= *((struct in_addr *)host->h_addr);
        bzero(&(serv_addr.sin_zero),8);
        
        printf("connect readly\n");
        if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {
                perror("connect faild");
                exit(1);
        }
        printf("connect success!\n");
        switch(argv[1][1])
        {
             case 't' :
               
                if((sendbytes = send(sockfd,"t",2,0)) == -1) {
                perror("send faild ");
                exit(1);
                }
                sleep(10);
                if((sendbytes = send(sockfd,argv[3],strlen(argv[3]),0)) == -1) {
                       perror("send faild ");
                       exit(1);
                }
               
                if((fd=fopen(argv[3],"w")) != NULL)
                {
                       
                        sleep(10);
                        if(recvbytes = recv(sockfd,buf,MAXDATASIZE,0) ==-1) {
                                perror("recvfrom faild");
                                exit(1);
                                }
                        printf("recv success!");

                        if((writebytes = fwrite(buf,sizeof(char),recvbytes,fd)) < 0) {
                                perror("write faild");
                                exit(1);
                        }
                        printf("files download success,files size:%dB\n",writebytes);
                }
               
                fclose(fd);
                break;
                case 's':     
                  if((sendbytes = send(sockfd,argv[3],MAXDATASIZE,0)) == -1) {
                        perror("send faild");
                        exit(1);
                        }
                  printf("message: %s\n",argv[3]);
                  break;
               
                default:
                  exit(1);
         }
       
        close(sockfd);
}
***************************************************
//server.c//
#include<stdio.h>
#include<stdlib.h>
#include<sys/file.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<error.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>

#define server_port 1234
#define MAXDATASIZE 2048
#define BACKLOG 10
#define MAXFILE 65535

int main(){
  
   int fd;
   int sockfd,client_fd;
   struct sockaddr_in server_sockaddr,client_sockaddr;
   int n=0,sin_size,recvbytes,sendbytes;
   char c,buf[MAXDATASIZE];


   if((sockfd = socket(AF_INET,SOCK_STREAM,0))  == -1) {
        perror("socket faild!");
        exit(1);
        }
       printf("socket success! sockfd %d\n",sockfd);

        server_sockaddr.sin_family = AF_INET;
        server_sockaddr.sin_port = htons(server_port);
        server_sockaddr.sin_addr.s_addr = INADDR_ANY;
        bzero(&(server_sockaddr.sin_zero),0);

        if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr)) == -1) {
                perror("bind faild!");
                exit(1);
        }
        printf("bind success!\n");
        if(listen(sockfd,BACKLOG) == -1) {
             perror("listen faild!");
             exit(1);
        }
       
        printf("Listen........!\n");

          if((client_fd = accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size)) == -1)         {
                perror("accept faild!");
                exit(1);
               }

            if((recvbytes = recv(client_fd,buf,MAXDATASIZE,0)) == -1)
            {
                perror("recv");
                exit(1);
            }


           if((strcmp(buf,"t")) == 0)               
            {
                memset(buf,0,sizeof(buf));

                if( recv(client_fd,buf,MAXDATASIZE,0) == -1) {      
                        perror("recv faild");
                        exit(1);
                }
                printf("buf : %s\n",buf);
                if((fd=open(buf,O_RDONLY)) < 0) {
                        perror("fopen faild!");
                        exit(1);
                        }
                printf("file : %s is existing! number: %d\n",buf,fd);

                memset(buf,0,sizeof(buf));
                 
               
                /*while((c=fgetc(fd)) != EOF || n <= MAXDATASIZE )
                {
                 buf[n] = c;
                 n++;
                }a
                if((sendbytes = send(sockfd,buf,MAXDATASIZE,0)) == -1) {
                        perror("send faild");
                        exit(1);
                     }*/
               
                if((c =read(fd,buf,MAXDATASIZE)) == -1) {
                        perror("read faild");
                        exit(1);
                }
                printf("read success !\n");
                //printf("buf: %s\n",buf);   ok
               
                if((sendbytes = send(sockfd,buf,c,0)) == -1){
                            perror("send faild");
                        exit(1);
                }

                       
                printf("file send success!\n");       
                close(fd);
               }
             else
                   printf("message: %s\n",buf);
     close(sockfd);
}
               
            
问题出现在server端能读取client -t ip filenames 端要得文件,但是发送却不成功且无任何信息提示。程序中对文件内容发送做了一个判断,发送不成功报错,并退出程序。如果成功则打印file send success!
可这些都没有提示。
更奇怪的是client竟然能接受server发来的信息并且写文件成功,可文件内容是乱码,小弟是刚学socket,还请高手指教阿!

论坛徽章:
0
2 [报告]
发表于 2007-03-23 12:49 |只看该作者
这么多程序,谁有时间看啊,你人什么问题,最好直接问

论坛徽章:
0
3 [报告]
发表于 2007-03-23 13:00 |只看该作者
简单点就是 server 端
if((sendbytes = send(sockfd,buf,c,0)) == -1){
                            perror("send faild");
                        exit(1);
                }
发不出数据,但也不报错

论坛徽章:
0
4 [报告]
发表于 2007-03-23 16:23 |只看该作者
第一感觉是server在读的时候有错误,等我调一调再来跟大家讨论
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP