#include #define EHCO_PORT 8080
#define MAX_CLIENT_NUM 10
int main()
{
int socketfd;
socketfd = socket(AF_INET, SOCK_STREAM, 0);
if(socketfd == -1)
{
printf("errno=%d ", errno);
exit(1);
}
else
{
printf("socket create successfully ");
}
struct sockaddr_in sa;
bzero(&sa, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(EHCO_PORT);
sa.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&(sa.sin_zero), 8);
if(bind(socketfd, (struct sockaddr *)&sa, sizeof(sa))!= 0)
{
printf("bind failed ");
printf("errno=%d ", errno);
exit(1);
}
else
{
printf("bind successfully ");
}
//listen
if(listen(socketfd ,MAX_CLIENT_NUM) != 0)
{
printf("listen error ");
exit(1);
}
else
{
printf("listen successfully ");
}
int clientfd;
struct sockaddr_in clientAdd;
char buff[101];
socklen_t len = sizeof(clientAdd);
int closing =0;
while( closing == 0 && (clientfd = accept(socketfd, (struct sockaddr *)&clientAdd, &len)) >0 )
{
int n;
while((n = recv(clientfd,buff, 100,0 )) > 0)
{
printf("number of receive bytes = %d ", n);
write(STDOUT_FILENO, buff, n);
send(clientfd, buff, n, 0);
buff[n] = '';
if(strcmp(buff, "quit ") == 0)
{
break;
}
else if(strcmp(buff, "close ") == 0)
{
//server closing
closing = 1;
printf("server is closing ");
break;
}
}
close(clientfd);
}
close(socketfd);
return 0;
}
经过cc编译后,即可运行。在这里我们写的程序是服务器程序,要想完成通信,也得写一个客户端程吧???
呵呵,我们先把客户端的程序放下来,先测测我们服务器程序吧。在这里,我们使用 telnet充当客户端进行测试,telnet可以说是一个很好的客户端程序。呵呵:
本机IP为192.168.0.69,整个通信过程如下:
linyongting@linyongting:~$ telnet 192.168.0.69 8080
Trying 192.168.0.69...
Connected to 192.168.0.69.
Escape character is '^]'.
hello! This is my first packet.Can you reply to me?
hello! This is my first packet.Can you reply to me?
Ohh, U did it!
Ohh, U did it!
see U next time!!!
see U next time!!!
quit
quit
Connection closed by foreign host.
linyongting@linyongting:~$ telnet 192.168.0.69 8080
Trying 192.168.0.69...
Connected to 192.168.0.69.
Escape character is '^]'.
close
close
Connection closed by foreign host.
上面连接了两次,第一次时,与服务器通信3次,每次发信息过去后,都收到与发出来一模一样的信息。当用户输入quit的时候,服务端就会关闲与客户通信的socket,通信结束。第二次客户只输入close,服务器响应后马上关闭服务器,同时也关闭客户端。下面是服务器的显示内容:
linyongting@linyongting:~/program/c$ ./echoServer
socket create successfully
bind successfully
listen successfully
//第一次通信
number of receive bytes = 53
hello! This is my first packet.Can you reply to me?
number of receive bytes = 16
Ohh, U did it!
number of receive bytes = 20
see U next time!!!
number of receive bytes = 6
quit
//第二次通信
number of receive bytes = 7
close
server is closing
当客户端输入quit时,只是客户端关闭,服务器还接着为其它客服端服务。当客户端输入 close时,服务关闭。
当前出现的问题:
我们的服务器序程只能与一个客户端进行通信,只能当客户端发出quit命令关闭后才能与下一个客户端通信。