intresting stuff. ya this device I have broacasting over ethernet needs to be asked as well. you send it a string and it sends some binary data back
---------- Post updated at 11:44 AM ---------- Previous update was at 11:31 AM ----------
Okay, been doing some toying here. This is probably going to be very obvious but something isn't working. I have been trying to setup a server that uses the select call to handle multiple client connections.
I use a master socket which listens on a port/IP and adds incoming connections to an array of child connections.
My client application simply reads from the socket over and over. What I want to do is once a new client connection is made on the server simply continue to send a message to that client. Then the client just printf's the message to the console.
Once I get a bare-bones version going I have a couple of different applications to apply this to.
Thanks a lot in advance. If I have done anything dumb...go easy
---------- Post updated at 11:46 AM ---------- Previous update was at 11:44 AM ----------
---------- Post updated at 11:48 AM ---------- Previous update was at 11:46 AM ----------
SERVER:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
int g_portno = 40000;
int main (int argc, char *argv[]){
FILE * error;
error = fopen("server_error.txt","w");
int i;
//Parse command line:
/*if(argc != 2){
printf("Please specify how clients will connect?\n");
exit(0);
}
int num_connections,i;
num_connections = atoi(argv[1]);
printf("num connections: %i\n",num_connections);
*/
//CREATE SOCKET:
int master_socket = socket(AF_INET,SOCK_STREAM,0);
if(master_socket<0){
fprintf(error,"socket create fail\n");
exit(0);
}
//initialize all client_socket[] to 0 so not checked:
int max_clients = 30;
int client_socket[30];
for(i=0;i<max_clients;i++){
client_socket = 0;
}
int opt=1;
if(setsockopt(master_socket,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(opt))<0){
fprintf(error,"setsockopt fail\n");
exit(0);
}
struct sockaddr_in serv_addr;
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(g_portno);
//BIND:
int bd = bind(master_socket,(struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(bd<0){
fprintf(error,"bind error\n");
exit(0);
}
//LISTEN:
int l = listen(master_socket,10);
if(l<0){
fprintf(error,"listen error");
exit(0);
}
char buffer[1024];
bzero(buffer,1024);
int max_sd,sd,activity,s;
fd_set readfds;
while(1){
//clear the socket set:
FD_ZERO(&readfds);
//add master_socket to set:
FD_SET(master_socket,&readfds);
max_sd = master_socket;
//add child sockets to set:
for(i=0;i<max_clients;i++){
//socket descriptor:
sd = client_socket;
//if valid socket desrciptor then add to read list:
if(sd > 0) FD_SET(sd,&readfds);
//highest file descrptor number, need it for the select function:
if(sd > max_sd) max_sd = sd;
}
//wait for an activity on one of the sockets, timeout is NULL, so wait indefinitely.
activity = select(max_sd + 1,&readfds,NULL,NULL,NULL);
if(activity < 0 ){
fprintf(error,"select error\n");
exit(0);
}
//if something happened on the master socket, then its an incoming connection:
if(FD_ISSET(master_socket,&readfds)){
int newsockfd = accept(master_socket, (struct sockaddr*)NULL, NULL);
if(newsockfd<0){
fprintf(error,"accept fail\n");
exit(0);
}
printf("new connection established on fd: %i\n",newsockfd);
//add new socket to array of sockets:
for(i=0;i<max_clients;i++){
if(client_socket == 0){
client_socket = newsockfd;
printf("Adding to list of sockets as: %d\n",i);
break;
}
}
snprintf(buffer,1024,"connected...\n");
send(newsockfd,buffer,strlen(buffer),0);
}
for(i=0;i<max_sd;i++){
if(FD_ISSET(client_socket,&readfds)){
snprintf(buffer,1024,"Hello from server client %i\n",i);
s = send(client_socket, buffer, strlen(buffer),0);
if(s==-1){
fprintf(error,"send fail\n");
exit(0);
}
}
sleep(1);
}
}
return 0;
}
---------- Post updated at 11:51 AM ---------- Previous update was at 11:48 AM ----------
CLIENT:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
int g_portno = 40000;
int main (int argc, char *argv[]){
FILE * error;
error = fopen("client_1_error.txt","w");
if(argc != 2){
printf("Need an IP address\nTry again please\n");
exit(0);
}
//CREATE SOCKET:
int client_1_socket = socket(AF_INET,SOCK_STREAM,0);
if(client_1_socket<0){
fprintf(error,"socket create fail\n");
exit(0);
}
struct sockaddr_in serv_addr;
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(g_portno);
if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0){
fprintf(error,"inet_pton error occured\n");
exit(0);
}
int connection = connect(client_1_socket,(struct sockaddr *)&serv_addr, sizeof(serv_addr));
if(connection<0){
fprintf(error,"connection problem\n");
exit(0);
}
char buffer[1024];
bzero(buffer,1024);
while(1){
int n = read(client_1_socket,buffer,sizeof(buffer));
if(client_1_socket<0){
fprintf(error,"socket has closed\n");
exit(0);
}
if(n<0){
printf("read problem\n");
exit(0);
}
printf("%s",buffer);
}
return 0;
}
---------- Post updated at 05:56 PM ---------- Previous update was at 11:51 AM ----------
Ok, all good.
Just needed to create another fd_set to monitor writeable sockets.