1
poll()
システムコールを使用する単純なクライアント/サーバープログラムのセットを作成しようとしています。私のコードはプログラムを実行している間は完全にコンパイルされますが、クライアントとサーバは出力を表示しません。さらに、クライアントは入力を続け、決して停止しません。ここ は、サーバーコードである:ここでソケットAPIを使用する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);
}
は、あなたがこの動作を引き起こし、どのようにこれを停止し、実行することです何かを見つける私を助けることができる場合、それは本当に参考になるでプログラムを正しく。
あなたにも受動的なリスニングソケットにポーリングする必要があります。受け入れ可能な新しい接続があるときは、読み込み( 'POLLIN')の準備が整います。 –