#include<stdio.h>
#include<pthread.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 1024
#define MYPORT 8080
#define MAXLISTEN 20
#define SERVER_IP "192.168.106.10"
static int sockfdbuf[MAXSIZE]={0};
static char namebuf[MAXSIZE][MAXSIZE]={0};
static char message[MAXSIZE];
struct sockaddr_in server_addr,client_addr;
int tcp_init(int sockfd)
{
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
perror("socket error");
exit(1);
}else
{
printf("socket success,sockfd = %d\n",sockfd);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(server_addr.sin_zero,8);
return sockfd;
}
int tcp_bind(int sockfd)
{
int ret;
ret = bind(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
if(ret!=0)
{
perror("bind error");
exit(1);
}else
{
printf("bind success\n");
}
ret = listen(sockfd,MAXLISTEN);
if(ret!=0)
{
perror("listen error");
exit(1);
}else
{
printf("listen success now!\n");
}
}
int get_clientip(int newsockfd)
{
struct sockaddr_in client;
socklen_t client_len = sizeof(client);
char client_ip[20];
getpeername(newsockfd,(struct sockaddr*)&client,&client_len);
inet_ntop(AF_INET,&client.sin_addr,client_ip,sizeof(client_ip));
printf("client_ip:%s\n",client_ip);
}
void* thread_sed(void* arg)
{
int i;
int ret;
char buffer[200];
int b = (int )arg;
while(1)
{
ret=recv(sockfdbuf[b],buffer,sizeof(buffer),0);
if(ret<0)
{
printf("recv error\n");
}else if(ret == 0)
{
printf("client is close\n");
break;
}else
{
printf("buffer=%s\n",buffer);
}
for(i=0;i<=b;i++)
{
ret = send(sockfdbuf[i],namebuf[i],strlen(namebuf[i]),0);
if(ret == -1)
{
perror("send error");
exit(1);
}else
{
printf("send %d bytes to client\n",ret);
}
}
}
}
int main()
{
int sockfd;
int ret;
int i=0;
int addrlen=0;
void *val=0;
pthread_t tid1,tid2;
int newsockfd;
sockfd = tcp_init(sockfd);
tcp_bind(sockfd);
addrlen = sizeof(struct sockaddr);
while(1)
{
sockfdbuf[i] = accept(sockfd,(struct sockaddr*)&client_addr,&addrlen);
if(sockfdbuf[i]<=-1)
{
perror("accept error");
exit(1);
}else
{
printf("accept success! newsockfd=%d\n",newsockfd);
}
get_clientip(sockfdbuf[i]);
int recbytes=0;
recbytes=recv(sockfdbuf[i],namebuf[i],sizeof(namebuf),0);
if(recbytes == 0)
{
perror("client is close the socket");
exit(1);
}else
{
printf("receive %d bytes from %s client\n",recbytes,namebuf[i]);
printf("name:%s\n",namebuf[i]);
}
int ret=0;
ret = send(sockfdbuf[i],namebuf[i],strlen(namebuf[i]),0);
if(ret == -1)
{
perror("send error");
exit(1);
}else
{
printf("send %d bytes to client\n",ret);
}
ret = pthread_create(&tid1,NULL,thread_sed,(void*)i);
if(ret!=0)
{
perror("create error");
exit(1);
}else
{
printf("thread create success!\n");
}
i++;
}
pthread_join(tid1,NULL);
close(sockfd);
return 0;
}
#include<pthread.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 1024
#define MYPORT 8080
#define MAXLISTEN 20
#define SERVER_IP "192.168.106.10"
static int sockfdbuf[MAXSIZE]={0};
static char namebuf[MAXSIZE][MAXSIZE]={0};
static char message[MAXSIZE];
struct sockaddr_in server_addr,client_addr;
int tcp_init(int sockfd)
{
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
perror("socket error");
exit(1);
}else
{
printf("socket success,sockfd = %d\n",sockfd);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(server_addr.sin_zero,8);
return sockfd;
}
int tcp_bind(int sockfd)
{
int ret;
ret = bind(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
if(ret!=0)
{
perror("bind error");
exit(1);
}else
{
printf("bind success\n");
}
ret = listen(sockfd,MAXLISTEN);
if(ret!=0)
{
perror("listen error");
exit(1);
}else
{
printf("listen success now!\n");
}
}
int get_clientip(int newsockfd)
{
struct sockaddr_in client;
socklen_t client_len = sizeof(client);
char client_ip[20];
getpeername(newsockfd,(struct sockaddr*)&client,&client_len);
inet_ntop(AF_INET,&client.sin_addr,client_ip,sizeof(client_ip));
printf("client_ip:%s\n",client_ip);
}
void* thread_sed(void* arg)
{
int i;
int ret;
char buffer[200];
int b = (int )arg;
while(1)
{
ret=recv(sockfdbuf[b],buffer,sizeof(buffer),0);
if(ret<0)
{
printf("recv error\n");
}else if(ret == 0)
{
printf("client is close\n");
break;
}else
{
printf("buffer=%s\n",buffer);
}
for(i=0;i<=b;i++)
{
ret = send(sockfdbuf[i],namebuf[i],strlen(namebuf[i]),0);
if(ret == -1)
{
perror("send error");
exit(1);
}else
{
printf("send %d bytes to client\n",ret);
}
}
}
}
int main()
{
int sockfd;
int ret;
int i=0;
int addrlen=0;
void *val=0;
pthread_t tid1,tid2;
int newsockfd;
sockfd = tcp_init(sockfd);
tcp_bind(sockfd);
addrlen = sizeof(struct sockaddr);
while(1)
{
sockfdbuf[i] = accept(sockfd,(struct sockaddr*)&client_addr,&addrlen);
if(sockfdbuf[i]<=-1)
{
perror("accept error");
exit(1);
}else
{
printf("accept success! newsockfd=%d\n",newsockfd);
}
get_clientip(sockfdbuf[i]);
int recbytes=0;
recbytes=recv(sockfdbuf[i],namebuf[i],sizeof(namebuf),0);
if(recbytes == 0)
{
perror("client is close the socket");
exit(1);
}else
{
printf("receive %d bytes from %s client\n",recbytes,namebuf[i]);
printf("name:%s\n",namebuf[i]);
}
int ret=0;
ret = send(sockfdbuf[i],namebuf[i],strlen(namebuf[i]),0);
if(ret == -1)
{
perror("send error");
exit(1);
}else
{
printf("send %d bytes to client\n",ret);
}
ret = pthread_create(&tid1,NULL,thread_sed,(void*)i);
if(ret!=0)
{
perror("create error");
exit(1);
}else
{
printf("thread create success!\n");
}
i++;
}
pthread_join(tid1,NULL);
close(sockfd);
return 0;
}