Friday 15 March 2013

c - Why is select() not returning in my code? -



c - Why is select() not returning in my code? -

i need help debugging code multiplayer game single server (acting master) , multiple clients. want connect multiple clients server using select , fd_set functions.

once client connects server, save file descriptor in array , check if info available on file read (using select). if yes, read data, else want broadcast message clients. run repeatedly in loop. every second, want broadcast message clients. @ same time, want receive info client too. checking availabity of info help of select function.

here code:

server.c:

#include"stdio.h" #include"stdlib.h" #include"sys/types.h" #include"sys/socket.h" #include"string.h" #include"netinet/in.h" #include "sys/select.h" #include <fcntl.h> #define port 5000 #define buf_size 2000 #define claddr_len 100 int arr[4] = { 0 }; char clientaddr[4][claddr_len]; void main() { struct sockaddr_in addr, cl_addr; int sockfd, len, ret, newsockfd; char buffer[buf_size]; fd_set fds; int maxfd = -1; int = 0, j = 0; sockfd = socket(af_inet, sock_stream, 0); if (sockfd < 0) { printf("error creating socket!\n"); exit(1); } printf("socket created...\n"); memset(&addr, 0, sizeof(addr)); addr.sin_family = af_inet; addr.sin_addr.s_addr = inaddr_any; addr.sin_port = port; ret = bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)); if (ret < 0) { printf("error binding!\n"); exit(1); } printf("binding done...\n"); printf("waiting connection...\n"); listen(sockfd, 4); (j = 0; j < 2; j++) { //infinite loop len = sizeof(cl_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cl_addr, &len); if (newsockfd < 0) { printf("error accepting connection!\n"); exit(1); } printf("connection accepted...\n"); inet_ntop(af_inet, &(cl_addr.sin_addr), clientaddr[j], claddr_len); arr[j] = newsockfd; printf("\n%d", newsockfd); //fd_zero(&fds); //fd_set(newsockfd, &fds); } close(sockfd); (j = 0; j < 2; j++) { if (arr[j] > maxfd) maxfd = arr[j]; // fd_set(arr[j], &fds); // fcntl(arr[i], f_setfl, o_nonblock); //stop listening new connections main process. } //the kid go on listen. //the main process handles connected client. while (1) { (i = 0; < 2; i++) { fd_set(arr[i], &fds); } int returned = select(maxfd + 1, &fds, null, null, null); if (returned) { (i = 0; < 2; i++) { if (fd_isset(arr[2], &fds)) { ret = recvfrom(arr[i], (void*) &buffer, sizeof(buffer), 0, null, null); if (ret < 0) { printf("error receiving data!\n"); exit(1); } printf("%s", buffer); } } } (j = 0; j < 2; j++) { ret = sendto(arr[j], "abc", buf_size, 0, (struct sockaddr *) &cl_addr, len); if (ret < 0) { printf("error sending data!\n"); exit(1); } printf("sent info %s: %s\n", clientaddr[j], buffer); } } /*while (1) { (j = 0; j < 2; j++) { memset(buffer, 0, buf_size); if (fd_isset(arr[j], &fds)) { ret = recvfrom(arr[j], buffer, buf_size, 0, (struct sockaddr *) &cl_addr, &len); if (ret < 0) { printf("error receiving data!\n"); exit(1); } printf("received info %s: %s\n", clientaddr[j], buffer); } } (j = 0; j < 2; j++) { ret = sendto(arr[j], "abc", buf_size, 0, (struct sockaddr *) &cl_addr, len); if (ret < 0) { printf("error sending data!\n"); exit(1); } printf("sent info %s: %s\n", clientaddr[j], buffer); } /* close(arr[0]); close[arr[1]); close(arr[2]); close(arr[3]); }*/ }

client.c:

#include"stdio.h" #include"stdlib.h" #include"sys/types.h" #include"sys/socket.h" #include"string.h" #include"netinet/in.h" #include"netdb.h" #define port 5555 #define buf_size 2000 int main(int argc, char**argv) { struct sockaddr_in addr, cl_addr; int sockfd, ret; char buffer[buf_size]; struct hostent * server; char * serveraddr; if (argc < 2) { printf("usage: client < ip address >\n"); exit(1); } serveraddr = argv[1]; sockfd = socket(af_inet, sock_stream, 0); if (sockfd < 0) { printf("error creating socket!\n"); exit(1); } printf("socket created...\n"); memset(&addr, 0, sizeof(addr)); addr.sin_family = af_inet; addr.sin_addr.s_addr = inet_addr(serveraddr); addr.sin_port = port; ret = connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)); if (ret < 0) { printf("error connecting server!\n"); exit(1); } printf("connected server...\n"); memset(buffer, 0, buf_size); //printf("enter message(s): "); //while (fgets(buffer, buf_size, stdin) != null) { sleep(10); ret = sendto(sockfd, "a", buf_size, 0, (struct sockaddr *) &addr, sizeof(addr)); if (ret < 0) { printf("error sending data!\n\t-%s", buffer); } ret = recvfrom(sockfd, buffer, buf_size, 0, null, null); if (ret < 0) { printf("error receiving data!\n"); } else { printf("received: "); fputs(buffer, stdout); printf("\n"); } homecoming 0; }

(the client passed ip address.)

this not work. while debugging server, waits @ select , nil received or sent. might problem be?

probably because aren't listening on right port. sockaddr_in members needs configured in network byte order:

memset(&addr, 0, sizeof(addr)); addr.sin_family = af_inet; addr.sin_addr.s_addr = htonl(inaddr_any); addr.sin_port = htons(port);

c sockets networking

No comments:

Post a Comment