您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

linux socket怎么实现使用线程独立收发消息

2024/3/21 17:23:29发布12次查看
代码实现
1、服务器端
/*tcpserver.c  2011.9.1 by yyg*/#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <pthread.h>#define myport 3490  //定义端口#define backlog 10#define maxdatasize 1024int 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]='\0';    if(strcmp(buf,exit)==0){  //若收到的是exit字符,则代表退出通信      printf(client is closed\n);      close(new_fd);      close(sockfd);      exit(1);    }    printf(client:%s\n,buf);  }/*while*/}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 %s\n,inet_ntoa(their_addr.sin_addr));  /*创建子线程,用于接收信息*/  if((pthread_create(&recthread,null,(void*)recmessage,null)) != 0){    printf(create thread error!\r\n);    exit(1);  }}int main(void){  struct sockaddr_in my_addr;  /*创建套接字*/  if((sockfd = socket(af_inet,sock_stream,0)) == -1){    perror(socket);    exit(1);  }  /*初始化sockaddr_in结构体相关参数*/  my_addr.sin_family = af_inet;  my_addr.sin_port = htons(myport);  my_addr.sin_addr.s_addr = inaddr_any;  bzero(&(my_addr.sin_zero),8);  /*绑定端口与套接字*/  if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) == -1){    perror(bind);    exit(1);  }  /*监听客户端套接字*/  if(listen(sockfd,backlog)== -1){    perror(listen);    exit(1);  }  printf(listening...\n);  /*创建子线程,用于接收信息*/  if((pthread_create(&accthread,null,(void*)acceptconnect,null))!=0){    printf(create thread error!\n);    exit(1);  }  while(1){    char msg[maxdatasize];    scanf(%s,msg);    if(send(new_fd,msg,strlen(msg),0) == -1){  //发送信息,与客户端交流      perror(send);      exit(1);    }    if(strcmp(msg,exit) ==0){      printf(byebye\n);      close(new_fd);      close(sockfd);      exit(1);    }  }/*while*/  return 0;}/*main*/
2.客户端
/*tcpclient.c    2010.9.1 by yyg*/#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <pthread.h>#include <netdb.h>#define port 3490#define backlog 10#define maxdatasize 1024int 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]='\0';    if(strcmp(buf,exit)==0){      printf(server is closed\n);      close(sockfd);      exit(1);    }    printf(server:%s\n,buf);  }/*while*/}int main(int argc,char *argv[]){  struct hostent *he;  struct sockaddr_in their_addr;  /*客户端输入方式:./client 172.31.100.236,若无输入后面ip地址,会提示错误*/  if(argc != 2){    fprintf(stderr,usage:client hostname\n);    exit(1);  }  /*获取主机ip地址*/  if((he = gethostbyname(argv[1])) == null){    herror(gethostbyname);    exit(1);  }  /*创建套接字*/  if((sockfd = socket(af_inet,sock_stream,0)) == -1){    perror(socket);    exit(1);  }  /*初始化sockaddr_in结构体*/  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!\r\n);    exit(1);  }  /*发送信息。接收发送信息用的是同一端口,都 是sockfd*/  while(1){    char msg[maxdatasize];    scanf(%s,msg);    if(send(sockfd,msg,strlen(msg),0) == -1){      perror(send);      exit(1);    }    if(strcmp(msg,exit) ==0){      printf(byebye\n);      close(sockfd);      exit(1);    }  }/*while*/  return 0;}
运行结果:
终端1:
[root@localhost net]# ./tcpserverserver:got connection from 172.31.100.236hello,world! client:helloclient:xiaolianclient:iouokexitbyebye
终端2:
[root@localhost net]# ./tcpclient 172.31.100.236server:hello,world!helloxiaolian iouserver:okserver is closed
以上就是linux socket怎么实现使用线程独立收发消息的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product