1
我正在嘗試編寫一組使用poll()
系統調用的簡單客戶端/服務器程序。雖然我的代碼在運行程序時完美編譯,但客戶端和服務器都不顯示輸出。此外,客戶繼續採取投入,永不停止。 這裏是服務器代碼:使用套接字的基於輪詢的客戶端服務器API
#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')。 – 2012-03-13 06:43:40