Hello,
I am trying to make chat for two users(using select()), but i am stuck on this code:
<pre>#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void chat(int sock_fd, struct sockaddr_in *peer){
int ret;
ssize_t bytes;
char buffer[1024];
char sendto_buffer[1024];
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
FD_SET(sock_fd, &readfds);
while (1) {
select(sock_fd + 1, &readfds, NULL, NULL, NULL);
if (FD_ISSET(STDIN_FILENO, &readfds)) {
bytes = read(0, sendto_buffer, sizeof(sendto_buffer));
if (bytes < 0) {
printf("Error\n");
break;
}
printf("Sending: %.*s\n", (int)bytes, sendto_buffer);
bytes = sendto(sock_fd, sendto_buffer, bytes, 0,(struct sockaddr *)peer, sizeof(struct sockaddr_in));
if (bytes < 0) {
printf("Error sendto \n");
break;
}
}
if(FD_ISSET(sock_fd, &readfds)) {
bytes = recvfrom(sock_fd, buffer, sizeof(buffer), 0, NULL, NULL);
if (bytes < 0) {
printf("Error recvfrom\n");
break;
}
if (bytes > 0) {
printf("Received: %.*s\n", (int)bytes, buffer);
}
}
}
}
int main(int argc, char *argv[]){
int localport;
int remoteport;
int sock_fd;
struct sockaddr_in server_addr;
struct sockaddr_in peer_addr;
if (argc < 4) {
printf("Usage %s <local port> <remote host> <remote port>\n", argv[0]);
return 1;
}
localport = strtoul(argv[1], NULL, 0);
emoteport = strtoul(argv[3], NULL, 0);
peer_addr.sin_family = AF_INET;
peer_addr.sin_port = htons(remoteport);
peer_addr.sin_addr.s_addr = INADDR_ANY;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd == -1){
perror("Socket error ");
return 1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(localport);
int local_bind = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
if(local_bind == -1){
perror("Bind error ");
return 1;
}
chat(sock_fd, &peer_addr);
close(sock_fd);
return 0;
}
Can someone give me some advice?
Thanks
What I have tried:
I tried to use select for this, but I think that I miss something important.