87 lines
2.3 KiB
C
87 lines
2.3 KiB
C
#include "common.h"
|
|
|
|
void toggle(int conn_sock, int hit);
|
|
void *serve_client(void *vargp);
|
|
|
|
typedef struct _client_data_t {
|
|
int conn_sock; //客户连接socket
|
|
int hit; //第几个客户
|
|
} client_data_t;
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int listen_sock, conn_sock, port,*conn_sock_p ;
|
|
struct sockaddr_in clientaddr;
|
|
struct hostent *hp;
|
|
char *haddrp;
|
|
client_data_t *cdp; //连接客户信息
|
|
int hit; //连接客户计数
|
|
|
|
socklen_t clientlen=sizeof(struct sockaddr_in);
|
|
|
|
pthread_t tid;
|
|
|
|
if (argc != 2) {
|
|
fprintf(stderr, "usage: %s <port>\n", argv[0]);
|
|
exit(1);
|
|
}
|
|
port = atoi(argv[1]);
|
|
|
|
listen_sock = open_listen_sock(port);
|
|
if( listen_sock==-1) {
|
|
printf("端口号%d繁忙\n",port);
|
|
exit(1);
|
|
}
|
|
|
|
for (hit=1; ; hit++) {
|
|
cdp = malloc(sizeof(client_data_t));
|
|
cdp->conn_sock = accept(listen_sock, (SA *) &clientaddr, &clientlen);
|
|
cdp->hit=hit;
|
|
|
|
/* determine the domain name and IP address of the client */
|
|
hp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr,
|
|
sizeof(clientaddr.sin_addr.s_addr), AF_INET);
|
|
haddrp = inet_ntoa(clientaddr.sin_addr);
|
|
printf("server connected to %s (%s)\n", hp->h_name, haddrp);
|
|
|
|
pthread_create(&tid, NULL, serve_client, (void *)cdp);
|
|
}
|
|
}
|
|
|
|
/* thread routine */
|
|
void * serve_client (void *vargp)
|
|
{
|
|
int hit,conn_sock;
|
|
client_data_t cd;
|
|
cd = *(client_data_t *)vargp;
|
|
|
|
pthread_detach(pthread_self());
|
|
free(vargp);
|
|
toggle(cd.conn_sock,cd.hit);
|
|
|
|
close(conn_sock);
|
|
return NULL;
|
|
}
|
|
|
|
//工作函数
|
|
void toggle(int conn_sock,int hit)
|
|
{
|
|
size_t n; int i,no=0;
|
|
char buf[MAXLINE];
|
|
|
|
printf("第%d个客户通信开始\n",hit);
|
|
while((n =recv(conn_sock, buf, MAXLINE,0))> 0) {
|
|
printf("toggle服务器收到第%d个客户第%d个消息,长度为%d字节\n", hit,++no,(int)n);
|
|
|
|
for(i=0; i<n; i++)
|
|
if(isupper(buf[i]))
|
|
buf[i]=tolower(buf[i]);
|
|
else if(islower(buf[i]))
|
|
buf[i]=toupper(buf[i]);
|
|
|
|
send (conn_sock, buf, n, 0);
|
|
}
|
|
printf("第%d个客户通信结束\n",hit);
|
|
}
|
|
|