server.c
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include "wrap.h"
#define SERV_PORT 8888
struct clie_info
{
struct sockaddr_in clie_addr;
int connfd;
};
void *read_msg(void *arg);
int main()
{
int i = 0;
int opt = 1;
int listenfd, cfd;
socklen_t clie_addr_len;
struct sockaddr_in serv_addr, clie_addr;
pthread_t tid;
struct clie_info thread_clie[256];
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
Bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
Listen(listenfd, 128);
while (1)
{
clie_addr_len = sizeof(clie_addr);
cfd = Accept(listenfd, (struct sockaddr *)&clie_addr, &clie_addr_len);
thread_clie[i].clie_addr = clie_addr;
thread_clie[i].connfd = cfd;
pthread_create(&tid, NULL, read_msg, (void *)&thread_clie[i]);
pthread_detach(tid);
i++;
}
return 0;
}
void *read_msg(void *arg)
{
int i, n;
char buf[BUFSIZ];
char clie_IP[INET_ADDRSTRLEN];
struct clie_info *thread_clie = (struct clie_info *)arg;
while (1)
{
n = Read(thread_clie->connfd, buf, sizeof(buf));
if (0 == n)
{
printf("Client %d closed\n", thread_clie->connfd);
break;
}
printf("Client IP: %s, Port: %d\n",
inet_ntop(AF_INET, &(*thread_clie).clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)),
ntohs((*thread_clie).clie_addr.sin_port));
for (i = 0; i < n; ++i)
{
buf[i] = toupper(buf[i]);
}
Write(thread_clie->connfd, buf, n);
}
Close(thread_clie->connfd);
return (void *)0;
}