Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
struct param
{
int sock_d;
struct sockaddr_in sock_a;
};
void *th_main(void *arg)
{
struct param *par= (struct param *)arg;
char send_data[1024];
char recv_data[1024];
int rw;
while(1)
{
printf("\n>> ");
gets(send_data);
send(par-> sock_d,send_data,strlen(send_data),0);
rw= recv(par-> sock_d,recv_data,sizeof(recv_data),0);
recv_data[rw]= '\0';
printf("\n<< %s",recv_data);
}
close(par-> sock_d);
pthread_exit(0);
}
int main()
{
int sock_fd,sock_st;
int val= 1;
int port= 5000;
socklen_t leng;
struct sockaddr_in serv,client;
struct param *par= (struct param *)malloc(sizeof(struct param));
if(sock_fd= socket(AF_INET,SOCK_STREAM,0)== -1);
{
printf("\nsocket [error]");
return -1;
}
if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(int))== -1)
{
printf("\nset [error]");
return -2;
}
memset((void *)&serv,0,sizeof(serv));
serv.sin_family= AF_INET;
serv.sin_port= htons(port);
serv.sin_addr.s_addr= INADDR_ANY;
bzero(&(serv.sin_zero),8);
if(bind(sock_fd,(struct sockaddr *)&serv,sizeof(struct sockaddr))== -1)
{
printf("\nbind [error]");
return -3;
}
if(listen(sock_fd,5)== -1)
{
printf("\nlisten [error]");
exit(0);
}
printf("\nTCP Server Waiting for client on port 5000");
fflush(stdout);
for(;;)
{
leng= sizeof(client);
if(sock_st= accept(sock_fd,(struct sockaddr *)&client,&leng)== -1)
printf("\naccept [error]");
else
{
printf("\nI got a connection from(%s,%d)",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
par-> sock_d= sock_st;
par-> sock_a= client;
pthread_t tid;
pthread_create(&tid,NULL,th_main,par);
pthread_detach(tid);
}
}
close(sock_fd);
return 0;
}