简单的服务器和客户程序

原创 2004年07月14日 09:45:00
简单的服务器
  这个服务器所做的全部工作是在流式连接上发送字符串 "Hello, World!/n"。你要测试这个程序的话,可以在一台机器上运行该程序,然后 在另外一机器上登陆:
   $ telnet remotehostname 3490
remotehostname 是该程序运行的机器的名字。
服务器代码:
#include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
#define MYPORT 3490 /*定义用户连接端口*/
#define BACKLOG 10 /*多少等待连接控制*/
main()
   {
   int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd
*/
   struct sockaddr_in my_addr; /* my address information */
   struct sockaddr_in their_addr; /* connector's address information */
   int sin_size;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
   perror("socket");
   exit(1);
   }

my_addr.sin_family = AF_INET; /* host byte order */
   my_addr.sin_port = htons(MYPORT); /* short, network byte order */
   my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
   bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct
sockaddr))== -1) {
   perror("bind");
   exit(1);
   }
if (listen(sockfd, BACKLOG) == -1) {
   perror("listen");
   exit(1);
   }

while(1) { /* main accept() loop */
   sin_size = sizeof(struct sockaddr_in);
   if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, /
   &sin_size)) == -1) {
   perror("accept");
   continue;
   }
   printf("server: got connection from %s/n", /
   inet_ntoa(their_addr.sin_addr));
   if (!fork()) { /* this is the child process */
   if (send(new_fd, "Hello, world!/n", 14, 0) == -1)
   perror("send");
   close(new_fd);
   exit(0);
   }
   close(new_fd); /* parent doesn't need this */
while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
   }
   }
如果你很挑剔的话,一定不满意我所有的代码都在一个很大的main() 函数中。如果你不喜欢,可以划分得更细点。
你也可以用我们下一章中的程序得到服务器端发送的字符串。

 

简单的客户程序
  这个程序比服务器还简单。这个程序的所有工作是通过 3490 端口连接到命令行中指定的主机,然后得到服务器发送的字符串。
客户代码:
#include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
#define PORT 3490 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
   {
   int sockfd, numbytes;
   char buf[MAXDATASIZE];
   struct hostent *he;
   struct sockaddr_in their_addr; /* connector's address information */

if (argc != 2) {
   fprintf(stderr,"usage: client hostname/n");
   exit(1);
   }
if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */
   herror("gethostbyname");
   exit(1);
   }

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
   perror("socket");
   exit(1);
   }

their_addr.sin_family = AF_INET; /* host byte order */
  their_addr.sin_port = htons(PORT); /* short, network byte order */
  their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  bzero(&(their_addr.sin_zero),; /* zero the rest of the struct */
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct
sockaddr)) == -1) {
   perror("connect");
   exit(1);
   }
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
   perror("recv");
   exit(1);
   }
buf[numbytes] = '/0';
printf("Received: %s",buf);
close(sockfd);
return 0;
   }
注意,如果你在运行服务器之前运行客户程序,connect() 将返回 "Connection refused" 信息,这非常有用。

【Unix 网络编程】TCP 客户/服务器简单 Socket 程序

前面介绍了Socket 编程函数  在编写 Socket 程序之前还需要了解TCP连接是如何建立的。(参考资料《Unix 网络编程》) 建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好...
  • yeswenqian
  • yeswenqian
  • 2014年03月20日 19:25
  • 1891

回射程序(客户端)——客户接收一行数据

基于流式套接字的服务器回射程序设计。 编写一服务器程序和客户程序,要求客户每输入一行数据,服务器接收后加上echo:回送给客户程序,当客户输入“q”后退出。...
  • zjscxgh
  • zjscxgh
  • 2014年04月09日 11:14
  • 682

TCP客户/服务器

《UNIX Network Programming Volume1: The Socket Networking API, Third Edition》 W.Richard Stevens /...
  • yss28
  • yss28
  • 2017年01月16日 15:25
  • 419

一个简单的时间获取客户端/服务器程序

TCP时间获取客户程序#include "unp.h"int main(int argc, char **argv) { int sockfd, n; c...
  • qq_33351410
  • qq_33351410
  • 2016年09月18日 11:01
  • 1820

UNIX网络编程笔记(4)—TCP客户/服务器程序示例

TCP客户/服务器程序示例
  • zhangxiao93
  • zhangxiao93
  • 2016年06月03日 16:06
  • 2229

一个简单的服务器与客户端程序

利用linux系统IO、socket,实现服务器与客户端直接的通信
  • yk_ee
  • yk_ee
  • 2016年11月19日 21:25
  • 1063

《UNIX网络编程》第一章——一个简单的时间获取客户端/服务器程序

该程序为《UNIX网络编程》第一卷中第一章出现的程序, 该程序经过本人测试通过。 操作系统:CentOS 7 编译器:GCC 时间获取的服务器程序如下:   #include ...
  • xiaolong361
  • xiaolong361
  • 2016年09月10日 09:40
  • 629

【Unix/Linux编程实践】DIY简单web服务器

一.服务器的设计问题:DIY or 代理1.DIY——服务器接收请求,自己处理工作——用于快速简单的任务;2.代理——服务器接收请求,然后创建一个新进程来处理工作——用于慢速的更加复杂的任务。二.we...
  • jiange_zh
  • jiange_zh
  • 2015年12月19日 15:55
  • 772

基于UDP协议的服务器/客户端程序

UDP网络程序采用的通信模型与TCP网络程序模型有很大的不同,具体见图7-4所示。 UDP服务器首先进行初始化操作:调用函数socket创建一个数据报类型的套接字,函数bind将这个套接字与服务...
  • suxinpingtao51
  • suxinpingtao51
  • 2013年09月18日 14:56
  • 1399

Java编写简单客户/服务器程序

1.建立EchoServer服务器,监听来自客户的连接 EchoServer.java: package chapter01; import java.io.*; import java.net.*...
  • scutwjh
  • scutwjh
  • 2014年12月02日 16:11
  • 315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的服务器和客户程序
举报原因:
原因补充:

(最多只允许输入30个字)