#include <iostream>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <algorithm>
#include <iterator>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sstream>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
const int PROCESS_NUMBER=3;
const int THREAD_NUMBER=1000;
pthread_mutex_t mutex;
void* thread_function(void* args)
{
std::stringstream buf;
struct sockaddr_in* server_addr = (sockaddr_in*)args;
int my_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (my_socket == -1)
{
perror("create socket failure");
pthread_exit(NULL);
}
char data[512];
bzero(data, sizeof(data));
snprintf(data, 512, "%ld", random());
buf<<"send data size is:"<<data<<std::endl;
if (sendto(my_socket, (void*)&data, sizeof(data), 0,(sockaddr*)server_addr, sizeof(sockaddr_in)) == -1)
{
perror("sendto data failure");
close(my_socket);
pthread_exit(NULL);
}
char buffer[1024];
struct sockaddr_in receive_addr;
socklen_t len = sizeof(sockaddr_in);
buf<<"wait for recvice data:";
std::size_t actual_len = recvfrom(my_socket, buffer, 1024, 0, (sockaddr*)&receive_addr, &len);
if (actual_len == -1)
{
perror("revcfrom data failure");
}
else
{
//buf<<std::endl<<pthread_self()<<"receive data:";
std::copy(buffer, buffer+actual_len, std::ostream_iterator<char>(buf));
buf<<"/n/n";
}
pthread_mutex_lock(&mutex);
printf("%s", buf.str().c_str());
pthread_mutex_unlock(&mutex);
close(my_socket);
}
int main(int argc, char* argv[])
{
pid_t pid;
int current_index=0;
while ((pid=fork())>0 && (++current_index<PROCESS_NUMBER));
//redirect stdout
char file_name[50];
bzero(file_name, sizeof(file_name));
snprintf(file_name, sizeof(file_name), "%ld", getpid());
if (dup2(open(file_name, O_APPEND|O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IXUSR), STDOUT_FILENO) == -1)
{
perror("dup2 failure");
return -1;
}
std::cout<<getpid()<<" process start"<<std::endl;
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(1120);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
srand((unsigned long)time(NULL));
pthread_t pt[THREAD_NUMBER];
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0)
{
perror("pthread attr init failure");
return -1;
}
if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN*2) != 0)
{
perror("pthread attr set stack failure");
return -1;
}
if (pthread_mutex_init(&mutex, NULL) != 0)
{
perror("pthread mutex init failuer");
return -1;
}
for (int i=0; i<THREAD_NUMBER; i++)
{
if (pthread_create(&pt[i], &attr, &thread_function, (void*)&server_addr) != 0)
{
perror("create thread fialure");
//perror(strcat(file_name,"create thread fialure"));
break;
}
}
for (int j=0; j<THREAD_NUMBER; j++)
{
pthread_join(pt[j], NULL);
}
pthread_mutex_destroy(&mutex);
std::cout<<getpid()<<"process exit"<<std::endl;
return 0;
}