c# windowsservice 启动 tcp监听_基于linux环境下 TCP的并发服务器(多线程)设计

ceddad7e3672053ebac0de6ef49ae069.png

linux环境下网络编程—设计并发服务器

利用多线程构建TCP并发服务器,并实现客户端和服务器的传输(多个并发用户同时访问服务器)

普通基于TCP的服务器端

创建一个socket调用socket()à绑定IP地址、端口号等信息到socket上调用bind()函数à监听客户端的连接请求,并设置允许的最大连接数调用listen()函数à接收客户端上的连接调用accept()函数à收发数据调用send()recv()/read()write()à关闭网络连接

普通基于TCP的客户端

创建一个socket调用socket()à设置要连接的对方主机地址和端口号等属à连接服务器调用connect()à收发数据调用send()recv()/read()write()à关闭网络连接

多线程构建TCP并发服务器,并实现客户端和服务器的传输(多个并发用户同时访问服务器)

创建一个socket调用socket()à绑定IP地址、端口号等信息到socket上调用bind()函数à监听客户端的连接请求,并设置允许的最大连接数调用listen()函数à接收客户端上的连接调用accept()函数à创建多线程,调用函数收发数据调用send()recv()/read()write()à关闭网络连接

【线程的创建函数原型:int pthread_create (pthread_t *tidp , const pthread_attr *attr, void *(*start_rtn)(void),void *arg)】

1、tcp_server_pthead.c

 #include    #include     #include   #include       #include          #include  #include  #include  #include  #include #define PORT 1234 #define BACKLOG 2 //最大连接数  void *start_routine( void *ptr) {       int fd = *(int *)ptr;      char buf[100];       int numbytes;       int i,c=0;       printf("this is a new thread,you got connected");       printf("fd=%d",fd);       if ((numbytes=recv(fd,buf,100,0)) == -1){ //读数据        printf("recv() error");              exit(1);        }        char str[100];       char buffer[100];    //将收到的字符串反转 toclient    for(c=0;   c

2、tcp_client_pthread.c

 #include   #include  #include  #include #include  #include  #include  #include   #include          #define PORT 1234    #define MAXDATASIZE 100  char receiveM[100]; char sendM[100]; int main(int argc, char *argv[]){       int fd, numbytes;          struct hostent *he;             struct sockaddr_in server;      //检查用户输入,如果用户输入不正确,提示用户正确的输入方法      if (argc !=2)  {                     printf("Usage: %s ",argv[0]);              exit(1);      }     // 通过函数 gethostbyname()获得字符串形式的ip地址,并赋给he使用hostname查询host 名字     if ((he=gethostbyname(argv[1]))==NULL)  {              printf("gethostbyname() error");             exit(1);       }     // 产生套接字fd客户程序开始建立 sockfd描述符      if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1)  {              printf("socket() error");             exit(1); } /* 客户程序填充服务端的资料 */      bzero(&server,sizeof(server));//初始化置0      server.sin_family = AF_INET; //ipv4    server.sin_port = htons(PORT);    (将本机器上的short数据转化为网络上的short数据)端口号server.sin_addr = *((struct in_addr *)he->h_addr);    // IP地址/* 客户程序发起连接请求 */      if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1)  {              printf("connect() error");             exit(1);      }     // 向服务器发送数据    printf("send message to server:");     fgets(sendM,100,stdin);      int send_le;      send_le=strlen(sendM);      sendM[send_le-1]='0';      send(fd,sendM,strlen(sendM),0);     // 从服务器接收数据      if ((numbytes=recv(fd,receiveM,MAXDATASIZE,0)) == -1)  {             printf("recv() error");             exit(1);       }       printf("receive message from server:%s",receiveM);      close(fd); /* 结束通讯 */ }
9364c7f07e6d6bb9d923cae13ad17ac1.png

需要训练营地址后台私信“1”获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值