Я пытаюсь написать набор простых программ клиент / сервер, использующих системный вызов poll()
. Хотя мой код прекрасно компилируется, при запуске программы клиент и сервер не отображают вывод. Кроме того, клиент продолжает принимать входные данные и никогда не останавливается.
Вот код сервера:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <poll.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
struct pollfd fdarray[5];
int sfd, port, nsfd, n, clen, ret, i;
char str[100];
struct sockaddr_in sadd, cadd;
memset(str, 0, sizeof(str));
if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Unable to create socke\n");
exit(1);
}
memset(&sadd, 0, sizeof(sadd));
//port = atoi(argv[1]);
sadd.sin_port = htons(9796);
sadd.sin_family = AF_INET;
sadd.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if (bind(sfd, (struct sockaddr *) &sadd, sizeof(sadd)) < 0) {
perror("Error binding to the socket\n");
exit(1);
}
listen(sfd, 5);
clen = sizeof(cadd);
for (i = 0; i < 5; i++) {
nsfd = accept(sfd, (struct sockaddr *) &cadd, &clen);
if (nsfd < 0) {
perror("Error accepting client\n");
exit(1);
}
fdarray[i].fd = nsfd;
fdarray[i].events = POLLIN;
fdarray[i].revents = 0;
}
ret = poll(fdarray,5,10);
for( i = 0; i < 5; i++) {
if (fdarray[i].revents ==POLLIN) {
n = read(fdarray[i].fd,str,100);
if (n < 0)
printf("error reading \n");
printf("message is : %s \n", str);
n = write(fdarray[i].fd, "message received...",
20);
}
}
return 0;
}
Вот код клиента
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <poll.h>
#include <unistd.h>
#define MAXCOUNT 1024
int main(int argc, char* argv[])
{
int sfd,i;
char msg[MAXCOUNT];
char blanmsg[MAXCOUNT];
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
sfd = socket(AF_INET,SOCK_STREAM,0);
saddr.sin_family = AF_INET;
inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr);
saddr.sin_port = htons(9796);
connect(sfd,(struct sockaddr*) &saddr, sizeof(saddr));
for(i = 0; i < 5; i++) {
memset(msg,0,MAXCOUNT);
memset(blanmsg,0,MAXCOUNT);
fgets(msg,MAXCOUNT,stdin);
send(sfd,msg,strlen(msg),0);
recv(sfd,blanmsg,sizeof(blanmsg),0);
printf("%s",blanmsg);
fflush(stdout);
}
exit(0);
}
Было бы очень полезно, если бы вы могли помочь мне выяснить, что вызывает такое поведение и как остановить это и правильно запустить программу.