⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socket.c

📁 我搜集到的一个java常用类库的源代码
💻 C
字号:
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <curses.h>#include <stdlib.h>#include <string.h>#include <signal.h>#include <sys/time.h>#include <pwd.h>#include <netdb.h>#include <sys/time.h>#include <unistd.h>#include "mjdef.h"#include "qkmj.h"struct passwd *userdata;int Check_for_data (fd)     int fd;/* Checks the socket descriptor fd to see if any incoming data has   arrived.  If yes, then returns 1.  If no, then returns 0.   If an error, returns -1 and stores the error message in socket_error.*/{  int status;                 /* return code from Select call. */  fd_set wait_set;     /* A set representing the connections that				 have been established. */  struct timeval tm;          /* A timelimit of zero for polling for new				 connections. */  FD_ZERO (&wait_set);  FD_SET (fd, &wait_set);  tm.tv_sec = 0;  tm.tv_usec = 500;  status = select (FD_SETSIZE, &wait_set, (fd_set *) 0, (fd_set *) 0, &tm);/*  if (status < 0)    sprintf (socket_error, "Error in select: %s", sys_errlist[errno]); */  return (status);}init_serv_socket(){  struct sockaddr_in serv_addr;           /* open a TCP socket for internet stream socket */  if( (serv_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)    err("Server: cannot open stream socket");    /* bind our local address */  bzero((char *)&serv_addr, sizeof(serv_addr));  serv_addr.sin_family = AF_INET;  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);  do  {    serv_addr.sin_port = htons(SERV_PORT);    SERV_PORT++;  }  while(bind(serv_sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr))<0);  listen(serv_sockfd, 10);  FD_SET(serv_sockfd,&afds);}get_my_info(){  userdata=getpwuid(getuid());  strcpy(my_username,userdata->pw_name);}init_socket(host,portnum,sockfd)char *host;int portnum;int *sockfd;{  struct sockaddr_in serv_addr;  bzero((char *) &serv_addr, sizeof(serv_addr));	serv_addr.sin_family	= AF_INET;  serv_addr.sin_addr.s_addr = inet_addr(host);  serv_addr.sin_port  = htons(portnum);	/* open a TCP socket */  if( (*sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)		err("client: cannot open stream socket");	/* connect to server */  if(connect(*sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)  {    return -1;  }}accept_new_client(){  int alen;  int i,player_id;  char msg_buf[255];/* Find a free space */  for(i=2;i<MAX_PLAYER;i++)    if(!player[i].in_table) break;  if(i==MAX_PLAYER)    err("Too many players!");  player_id=i;/* NOTICE: here we don't know player[player_id].addr *//* it's ok! just get size. */  alen=sizeof(player[player_id].addr);/* NOTICE: so here, player[player_id].sockfd must be wrong!! */  player[player_id].sockfd=accept(serv_sockfd, (struct sockaddr *)                                  &player[player_id].addr, &alen);  FD_SET(player[player_id].sockfd,&afds);  player[player_id].in_table=1;  player_in_table++;/* assign a sit to the new comer */  if(player_in_table<=PLAYER_NUM)  {    for(i=1;i<=4;i++)    {      if(!table[i])      {        player[player_id].sit=i;        table[i]=player_id;        break;      }    }  }  sprintf(msg_buf,"%s 加入此桌",new_client_name);  send_gps_line(msg_buf);  strcpy(player[player_id].name, new_client_name);  player[player_id].id=new_client_id;  player[player_id].money=new_client_money;  /* Send the info of new comer to everyone */  sprintf(msg_buf,"201%c%c%s", (char) player_id ,player[player_id].sit,          player[player_id].name);  broadcast_msg(1,msg_buf); /* NOTICE:including the new comer!!! */  msg_buf[2]='5';   /* Set msg_id to 205 */  /* send to himself *//* NOTICE: player doesn't know his own table[i], right? */  write_msg(player[player_id].sockfd,msg_buf);  /* Send more info of new comer */  sprintf(msg_buf,"202%c%5d%ld",player_id,new_client_id,new_client_money);  broadcast_msg(1,msg_buf);  new_client=0;  write_msg(gps_sockfd,"111");  /* Add one new player into the table */  /* Send all player info to the new player */  for(i=1;i<MAX_PLAYER;i++)  {    if(player[i].in_table && i!=player_id)    {      /* Let the new comer know everyone */      sprintf(msg_buf,"203%c%c%s",i,player[i].sit,player[i].name);      write_msg(player[player_id].sockfd,msg_buf);      sprintf(msg_buf,"202%c%5d%ld",i,player[i].id,player[i].money);      write_msg(player[player_id].sockfd,msg_buf);    }  }  /* Check the number of player in table */  if(player_in_table==PLAYER_NUM)  {    init_playing_screen();    broadcast_msg(1,"300");    opening();    open_deal();  }    /* Send table info to the new player *//*  sprintf(msg_buf,"204");  for(i=1;i<=4;i++)    msg_buf[2+i]=(char) table[i]+'0';  write_msg(player[player_id].sockfd,msg_buf);*/}int read_msg(fd,msg)int fd;char *msg;{  do  {    if(read(fd,msg,1)<=0)      return 0;  } while(*msg++ != '\0');  return 1;}int read_msg_id(fd,msg)int fd;char *msg;{  int i;  for(i=0;i<3;i++)  {    if(read(fd,msg,1)<=0)      return 0;    if(*msg++==0)      return 0;  }  return 1;}      write_msg(fd,msg)int fd;char *msg;{  int n;  n=strlen(msg);  if(write(fd,msg,n)<0)  {    return -1;  }  if(write(fd,msg+n,1)<0)  {    return -1;  }}/* Command for server */broadcast_msg(id,msg)int id;char *msg;{  int i;  for(i=2;i<MAX_PLAYER;i++)    if(player[i].in_table && i!=id)      write_msg(player[i].sockfd,msg);}close_client(player_id)int player_id;{  char msg_buf[255];  if(player_in_table==4)  {    init_global_screen();    input_mode=TALK_MODE;  }  player_in_table--;  sprintf(msg_buf,"206%c",player_id);  broadcast_msg(player_id,msg_buf);  sprintf(msg_buf,"%s 离开此桌",player[player_id].name);  display_comment(msg_buf);  close(player[player_id].sockfd);  FD_CLR(player[player_id].sockfd,&afds);  player[player_id].in_table=0;  table[player[player_id].sit]=0;}close_join(){  in_join=0;  write_msg(table_sockfd,"200");  close(table_sockfd);   FD_CLR(table_sockfd,&afds);/*  shutdown(table_sockfd,2);*/}close_serv(){  int i;  in_serv=0;  for(i=2;i<MAX_PLAYER;i++)  {    if(player[i].in_table)    {      write_msg(player[i].sockfd,"200");      close_client(i);/*      shutdown(player[i].sockfd,2);*/    }  }  FD_CLR(serv_sockfd,&afds);}leave()    /* the ^C trap. */{  int i;  write_msg(gps_sockfd,"200");/*  shutdown(gps_sockfd,2);*/   close(gps_sockfd);  if(in_join)    close_join();  if(in_serv)    close_serv();  endwin();  exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -