0
#include <sys/socket.h> // for socket(), bind(), listen(), accept()
#include <netinet/in.h> // for PF_INET, SOCK_STREAM, IPPROTO_TCP
#include <stdio.h> // for printf(), perror()
#include <unistd.h> // for read(), write(), close()
#include <string.h> // for bzero()
#define DEMO_PORT 9723
int main(void)
{
//-----------------------------------------
// create an unnamed socket for the server
//-----------------------------------------
int sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0)
{
perror("opening stream socket");
return -1;
}
printf("\nsock=%d \n", sock);
//----------------------------------------
// construct a name for the server socket
//----------------------------------------
struct sockaddr_in self;
socklen_t nlen = sizeof self;
bzero(&self, sizeof self);
self.sin_family = AF_INET;
self.sin_port = htons(DEMO_PORT);
self.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sock, (sockaddr *)&self, nlen) < 0)
{
perror("bind failed");
return -1;
}
printf("bind succeeded port: %d\n",DEMO_PORT);
//---------------------------------------------------------
// now create a connection queue and wait for some clients
//---------------------------------------------------------
if (listen(sock, 5) < 0)
{
perror("listen failed");
return -1;
}
printf("listen succeeded \n");
//---------------------------------------------------
// main loop to process clients' connection-requests
//---------------------------------------------------
while (1)
{
sockaddr_in peer;
socklen_t plen = sizeof peer;
bzero(&peer, plen);
printf("server waiting \n");
int client = accept(sock, (sockaddr *)&peer, &plen);
if (client < 0) { perror("accept"); break; }
//---------------------------------------------
// we can now read from or write to the client
//---------------------------------------------
char ch;
int index = 0;
char get[1024];
if (read(client, &ch, 1) < 0)
{
perror("read");
}
bool go = true;
while(go){
if(ch != '/' && ch != '\r'){
printf("read: %hhd\n", ch);
get[index] = ch;
printf("got stuff: %s\n", get);
index++;
read(index, &ch, 1);
} else {
go = false;
index = 0;
close(client);
printf("server responded, connection closed");
}
}
//if (write(client, &ch, 1) < 0) { perror("write"); break; }
}
close(sock);
printf("\n");
}
while(go)看起來從來沒有工作,它緩衝不正確。我沒有看到緩衝區內的模式或它的工作原理。寫入tcp服務器 - 緩衝流
這樣做的正確方法是什麼?除了一定數量的字節之外,將它們存儲在一個字符串中,如果到達換行符,則終止讀取操作?
不是客戶端也是一個整數? – stackOverFlew
是的雖然'索引'可能不是傳遞給讀系統調用的正確整數。 – spartacus