0
我試圖在客戶端向服務器發送文本「Hello World」的服務器/客戶端程序中,然後服務器將文本打印到終端。客戶端斷開連接後服務器很奇怪
客戶端程序終止後,服務器變得瘋狂,並繼續打印「Hello World」,直到我通過Ctrl-C終止服務器。有人可以幫我理解爲什麼嗎?
selectserver.c
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
main()
{
struct sockaddr_in serveraddr, clientaddr;
int clientaddrlen;
int request_sock, sock[2], numsocks, maxsocks;
char buf[12];
int i, rc;
fd_set fds, readfds;
struct timeval timeout;
numsocks = 0; maxsocks = 2;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
request_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bzero((void *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = INADDR_ANY;
serveraddr.sin_port = htons(2009);
bind(request_sock, (struct sockaddr *)&serveraddr, sizeof serveraddr);
listen(request_sock, SOMAXCONN);
FD_ZERO(&fds);
FD_SET(request_sock, &fds);
for (;;) {
readfds=fds;
rc=select (FD_SETSIZE, &readfds, NULL, NULL, &timeout);
if (rc<0)
return -1;
for (i = 0; i < FD_SETSIZE; i++)
if (FD_ISSET (i, &readfds)) {
if (i == request_sock) {
if(numsocks < maxsocks) {
sock[numsocks] = accept(request_sock,(struct sockaddr *)&clientaddr, (socklen_t *)&clientaddrlen);
FD_SET(sock[numsocks], &fds);
numsocks++;
} else {
printf("Ran out of space for sockets.\n");
return -1;
}
} else {
read(i, buf,11);
buf[11] = '\0';
printf("From socket %d: %s\n",i,buf);
}
}
}
close(request_sock);
}
selectclient.c
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
main(int argc, char *argv[])
{
struct sockaddr_in serveraddr;
int sock;
char buf[12];
int i;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bzero((void *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("192.168.1.3");
serveraddr.sin_port = htons(2009);
connect(sock, (struct sockaddr *)&serveraddr, sizeof serveraddr);
for(i=0; i<10; i++) {
write(sock, "Hello World", 11);
sleep(1);
}
close(sock);
}
但是,如果我測試0字節,然後關閉套接字,程序將終止,將無法偵聽另一個連接。 – user265767 2010-11-16 23:27:27
關閉* client *套接字,而不是* listen *套接字。 – EJP 2010-11-17 00:24:50