当前位置: 首页 > news >正文

socket聊天室—多线程服务器模型

服务器端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

#define RECVBUFSIZE 2048
void *rec_func(void *arg)
{
    int sockfd,new_fd,nbytes;
    char buffer[RECVBUFSIZE];
    int i;
    new_fd = *((int*)arg);
    free(arg);
    
    while(1)
    {
        if((nbytes=recv(new_fd,buffer,RECVBUFSIZE,0))==-1)
        {
            fprintf(stderr,"Read Error:%s\n",strerror(errno));
            exit(1);
        }
        if(nbytes ==-1)
        {
            close(new_fd);
            break;
        }
        if(nbytes == 0)
        {
            close(new_fd);
            break;
        }
        buffer[nbytes]='\0';
        printf("I have received:%s\n",buffer);
        
        if(send(new_fd,buffer,strlen(buffer),0)==-1)
        {
            fprintf(stderr,"Write Error:%s\n",strerror(errno));
            exit(1);
        }
    }
}
int main(int argc,char *argv[])
{
    char buff[RECVBUFSIZE];
    int sockfd,new_fd,nbytes;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int sin_size,portnumber;
    char hello[]="Hello! Socket communication world!\n";
    pthread_t tid;
    int *pconnsocket = NULL;
    int ret,i;

    if(argc!=2)
    {
        fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
        exit(1);
    }
    if((portnumber=atoi(argv[1]))<0)
    {
        fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
        exit(1);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        fprintf(stderr,"Socket errror:%s\n\a",strerror(errno));
        exit(1);
    }
    bzero(&server_addr,sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    server_addr.sin_port = htons(portnumber);
    
    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
        fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
        exit(1);
    }
    
    if(listen(sockfd,10)==-1)
    {
        fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
        exit(1);
    }
    while(1)
    {
        sin_size=sizeof(struct sockaddr_in);  
        if((new_fd=accept(sockfd,(struct sockaddr*)&client_addr,&sin_size))==-1)    
        {
            fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
            exit(1);
        }
        pconnsocket = (int *)malloc(sizeof(int));
        *pconnsocket = new_fd;
    
        ret = pthread_create(&tid,NULL,rec_func,(void*)pconnsocket);
        if(ret<0)
        {
            perror("pthread_create err");
            return -1;
        }
    }
    exit(0);
}


客户端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

#define RECVBUFSIZE 1024

void *func(void *arg)
{
    int sockfd,new_fd,nbytes;
    char buffer[RECVBUFSIZE];

    new_fd=*((int *)arg);
    free(arg);
    
    while(1)
    {
        if((nbytes=recv(new_fd,buffer,RECVBUFSIZE,0))==-1)
        {
            fprintf(stderr,"Read Error:%s\n",strerror(errno));
            exit(1);
        }
        buffer[nbytes]='\0';
        printf("I have received:%s\n",buffer);
    }
}

int main(int argc,char *argv[])
{
    int sockfd;
    char buffer[RECVBUFSIZE];
    struct sockaddr_in server_addr;
    struct hostnet *host;
    int portnumber,nbytes;
    pthread_t tid;
    int *pconnsocket=NULL;
    int ret;
    
    if(argc!=3)
    {
        fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
        exit(1);
    }
    if((portnumber=atoi(argv[2]))<0)
    {
        fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
        exit(1);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
        exit(1);
    }
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(portnumber);
    server_addr.sin_addr.s_addr=inet_addr(argv[1]);
    
    if(connect(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))==-1)
    {
        fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
        exit(1);
    }
    pconnsocket=(int *)malloc(sizeof(int));
    *pconnsocket=sockfd;
    
    ret=pthread_create(&tid,NULL,func,(void *)pconnsocket);
    if(ret<0)
    {
        perror("pthread_create err");
        return -1;
    }
    while(1)
    {
        #if 1
        printf("input msg:");
        scanf("%s",buffer);
        if(send(sockfd,buffer,strlen(buffer),0)==-1)
        {
            fprintf(stderr,"Write Error:%s\n",strerror(errno));
            exit(1);
        }
        #endif
    }
    close(sockfd);
    exit(0);
}

相关文章:

  • 【PAT甲级1505列表排序】结构体排序
  • 【第21节】C++设计模式(行为模式)-Chain of Responsibility(责任链)模式
  • 【Java代码审计 | 第十篇】命令执行漏洞成因及防范
  • Scala:柯里化函数的基本介绍(通俗易懂)
  • 深度学习(斋藤)学习笔记(五)-反向传播2
  • 平面机械臂运动学分析
  • 如何高效地找工作?
  • tomcat单机多实例部署
  • 2025年渗透测试面试题总结-腾某讯-技术安全实习生(题目+回答)
  • 使用XShell连接RHEL9并配置yum阿里源
  • 使用express创建服务器保存数据到mysql
  • linux安装nginx
  • 【前端基础】Day 10 CSS3-2D3D
  • Visual Studio Code for SAP (SAP PRESS) (Leon Hassan)
  • Vue中常见动画执行详解
  • 数据库高级面试题
  • 第六课:数据库集成:MongoDB与Mongoose技术应用
  • javaweb:Maven、SpringBoot快速入门、HTTP协议
  • OpenCV视频解码性能优化十连击(实测帧率提升300%)
  • Java数据结构:解构排序算法的艺术与科学(一)
  • wordpress稳定版/厦门百度整站优化服务
  • 织梦模板怎么单独做移动端网站/怎么宣传自己的产品
  • 做直播网站赚钱吗/百度推广区域代理
  • 苏州企业建设网站价格/免费的云服务器有哪些
  • 基于拍卖的拍卖网站开发/口碑营销渠道
  • 外贸网站建设排名/昆山seo网站优化软件