当前位置:  技术问答>linux和unix

【大侠看我】linux tcp socket 消息传输问题

    来源: 互联网  发布时间:2017-01-03

    本文导语:  小弟最近学习linux下的网络编程,编译调试都没问题,就是在进行通信的时候有点问题 比如在客户端输入:123 456,到了服务器端,却会分成两段来显示... 客户端:123   客户端:456 只要是我的输入中有空格,那么在...

小弟最近学习linux下的网络编程,编译调试都没问题,就是在进行通信的时候有点问题
比如在客户端输入:123 456,到了服务器端,却会分成两段来显示...
客户端:123  
客户端:456
只要是我的输入中有空格,那么在另一段的显示中都会被分割开
怎么才能让他们一起完整显示呢????求大家帮帮我哈
服务器端:
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define MYPORT 3490
#define BACKLOG 10 
#define MAXDATASIZE 1024

int sockfd,new_fd;
pthread_t accthread,recthread;

void recmessage(void){
  while(1){
  int numbytes;
  char buf[MAXDATASIZE];
  if((numbytes = recv(new_fd,buf,MAXDATASIZE,0)) == -1){
perror("recv");
exit(1);
  }
  buf[numbytes] = '';
  if(strcmp(buf,"exit") == 0){
printf("Client is closedn");
close(new_fd);
close(sockfd);
exit(1);
}
printf("Client:%sn",buf);
  }
}


void acceptconnect(void){
 struct sockaddr_in their_addr;
 int sin_size;
 sin_size = sizeof(struct sockaddr_in);
 if((new_fd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)) == -1){
  perror("accept");
  exit(1);
  }
  printf("server:got connection from %sn",(char*)inet_ntoa(their_addr.sin_addr));
 
 if((pthread_create(&recthread,NULL,(void *)recmessage,NULL))!= 0){
  printf("Create thread error!rn");
  exit(1);
  }
}
int main(void){
 struct sockaddr_in my_addr; //定义一个表示套接字的结构体
 if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){ //创建套接字,SOCK_STREAM表示面向连接的数据流传输,也就是TCP
  perror("socket");
  exit(1);
  }
  /*以下填充套接字结构体*/
  my_addr.sin_family = AF_INET; //IPv4地址族
  my_addr.sin_port = htons(MYPORT); //端口
  my_addr.sin_addr.s_addr = INADDR_ANY; //计算机上默认的本地地址127.0.0.1
  bzero(&my_addr,sizeof(my_addr)); //为结构体分配内存
  if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) == -1){ //绑定端口
  perror("bind");
  exit(1);
  }
  if(listen(sockfd,BACKLOG) == -1){ //监听,成功返回0,失败返回1.BACKLOG是能处理的最大连接数
  perror("listen");
  exit(1);
  }
  if((pthread_create(&accthread,NULL,(void *)acceptconnect,NULL)) != 0){ //开启线程
  printf("Create thread error!rn");
  exit(1);
  }
  while(1){ //进入循环
  char msg[MAXDATASIZE];
  scanf("%s",msg);
  if(send(new_fd,msg,strlen(msg),0) == -1){
  perror("send");
  close(new_fd);
  exit(1);
  }
  if(strcmp(msg,"exit") == 0){
  printf("Byebye!n");
  close(new_fd);
  close(sockfd);
  exit(1);
  }
 }
  return 0;
}

客户端:
#include
#include
#include
#include
#include
#include
#include
#include
#include


#define PORT 3490
#define MAXDATASIZE 1024
int sockfd;
pthread_t recthread;

void recmessage(void){
  while(1){
  int numbytes;
  char buf[MAXDATASIZE];
   
  if((numbytes = recv(sockfd,buf,MAXDATASIZE,0)) == -1){
  perror("recv");
  exit(1);
  }
  buf[numbytes]='';
  if(strcmp(buf,"exit") == 0){
  printf("Server is closedn");
  close(sockfd);
  exit(1);
  }
printf("Server:%sn",buf);
  }
}

int main(int argc,char *argv[]){
  struct hostent *he;
  struct sockaddr_in their_addr;
  if(argc != 2){
  fprintf(stderr,"usage:client hostnamen");
  exit(1);
  }
  if((he=gethostbyname(argv[1])) == NULL){
  herror("gethostbyname");
  exit(1);
  }
  if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
  perror("socket");
  exit(1);
  }
   
  their_addr.sin_family = AF_INET;
  their_addr.sin_port = htons(PORT);
  their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  bzero(&(their_addr.sin_zero),8);
  if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1){
  perror("connect");
  exit(1);
  }
  if((pthread_create(&recthread,NULL,(void *)recmessage,NULL))!=0){
  printf("Create thread error!rn");
  exit(1);
  }
  while(1){
  char msg[MAXDATASIZE];
  scanf("%s",msg);
  if(send(sockfd,msg,strlen(msg),0) == -1){
  perror("send");
  close(sockfd);
  exit(1);
  }
  if(strcmp(msg,"exit") == 0){
  printf("Byebye!n");
  close(sockfd);
  exit(1);
  }
}
  return 0;
}


各位看看吧

|
代码真够乱的,问题出在scanf()这个函数了 如果要在终端手动输入的话。有好多种方法的简单的这样写
while (fgets(buffer,sizeof(buffer),stdin)!=NULL) stdin=>就是屏幕了,这个输入完时,里面BUFFER会多个n

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 各位大侠,本人是新手上路,经理马上让做palm,我可是从0学起!有没有那位大侠给我介绍一点经验和好的技术论坛,谢了!
  • hotenM(CMP)大侠等EJB大侠进来!小问题请教!
  • 请教大侠,怎么选开发学习板?
  • 大侠请援手:有关动态连接库。
  • 写过BBS的大侠看过来!
  • 请各位大侠推荐两本Solaris的经典书籍?
  • 各位大侠,求助Linux下关机
  • 大侠们,我是新手,请教怎么判断串口是否有连接
  • 想各位大侠求教了,为什么我的jdbc驱动不支持absolute这个方法呢?
  • 数据恢复, 求大侠帮助, 急等!!!!!!!
  • 各位大侠,给点意见
  • JSP+数据库文本存取中的换行问题,请教大侠
  • 各位大侠:lock 命令怎么用?
  • 关于session方面的问题!哪位大侠帮帮忙!?
  • 各位大侠,那有JBuilder书down? 那有PDF格式文件的阅读器?
  • 各位大侠,还有一问题请教,如下:
  • 请“路人甲”大侠进来来看看。。。多谢了。。
  • 请各位大侠介绍几本 UNIX 的书籍
  • solaris,请大侠帮忙!
  • 哪位大侠能提供一些Motif的电子书?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3